import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; /** * Created by LiChao on 2017/9/29 */ public class Test3 { private static long start = new Date().getTime(); private static final ScheduledExecutorService excutor = Executors.newSingleThreadScheduledExecutor(); public static void main(String[] args) { Thread thread1 = new Thread(() -> { long end = new Date().getTime(); System.out.println("time wait:"+(end-start)+",this is 線程1"); },"線程1"); Thread thread2 = new Thread(() -> { long end = new Date().getTime(); System.out.println("time wait:"+(end-start)+",this is 線程2"); },"線程2"); Thread thread3 = new Thread(() -> { long end = new Date().getTime(); System.out.println("time wait:"+(end-start)+",this is 線程3"); },"線程3"); excutor.scheduleWithFixedDelay(thread1,0, 1 , TimeUnit.SECONDS); excutor.scheduleWithFixedDelay(thread2,0, 2 , TimeUnit.SECONDS); excutor.scheduleWithFixedDelay(thread3,0, 3 , TimeUnit.SECONDS); } }
輸出結果:
time wait:80,this is 線程1 time wait:80,this is 線程2 time wait:80,this is 線程3 time wait:1088,this is 線程1 time wait:2081,this is 線程2 time wait:2089,this is 線程1 time wait:3081,this is 線程3 time wait:3090,this is 線程1 time wait:4082,this is 線程2 time wait:4091,this is 線程1 time wait:5092,this is 線程1 time wait:6082,this is 線程3 time wait:6083,this is 線程2 time wait:6093,this is 線程1 time wait:7094,this is 線程1 time wait:8084,this is 線程2 time wait:8095,this is 線程1 time wait:9083,this is 線程3 time wait:9095,this is 線程1
線程池executor調用scheduleWithFixedDelay方法,同時放入三個不同調度的線程。從結果中可以看出每個線程按照自己的調度互不干擾的運行。此時修改線程2加一個阻塞再看看運行結果。
Thread thread2 = new Thread(() -> { long end = new Date().getTime(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("time wait:"+(end-start)+",this is 線程2"); },"線程2");
運行結果:
time wait:129,this is 線程1 time wait:130,this is 線程2 time wait:3130,this is 線程3 time wait:3130,this is 線程1 time wait:4131,this is 線程1 time wait:5131,this is 線程2 time wait:8131,this is 線程1 time wait:8131,this is 線程3 time wait:9132,this is 線程1 time wait:10132,this is 線程2 time wait:13132,this is 線程1 time wait:13132,this is 線程3 time wait:14133,this is 線程1 time wait:15133,this is 線程2 time wait:18133,this is 線程1 time wait:18133,this is 線程3 time wait:19134,this is 線程1 time wait:20134,this is 線程2 time wait:23142,this is 線程1 time wait:23142,this is 線程3
從結果中可以看出,當線程2被阻塞時,其它的線程也被阻塞不能運行。所以使用Executors.newSingleThreadScheduledExecutor()來創建線程池同時放入多個線程時,每個線程都會按照自己的調度來執行,但是當其中一個線程被阻塞時,其它的線程都會受到影響被阻塞,不過依然都會按照自身調度來執行,但是會存在阻塞延遲。