你能想到几个?先说需求,就是三个线程,假设是线程1、2、3,现在的需求是:必须先执行线程1,然后执行线程2,最后执行线程3被执行。那么有几种实现方法呢?其实它的本质就是实现,让线程2和线程3等待线程1执行完,所以重点是有什么方法可以让线程2和线程3等待。join第一反应应该是使用join方法,因为join本来就是支持这种机制的。比如我在线程B中调用了线程A的join方法,那么线程B就会等线程A执行完了再执行。如何使用它?不要慌,我这里有一个例子,看一下:(t2));t1.start();t2.start();t3.start();}staticclassWorkimplementsRunnable{privateThreadbeforeThread;publicWork(ThreadbeforeThread){this.beforeThread=beforeThread;}??@Overridepublicvoidrun(){//如果有的话是一个线程,就加入,如果不是,就输出;}catch(InterruptedExceptione){e.printStackTrace();}}else{System.out.println("threadstart:"+Thread.currentThread().getName());}}}}CountDownLatch刚才说了,其实质就是让线程B、C等待线程A执行完毕,那么信号量是个不错的选择。如果你想实现它,那么可能如下:publicclassThreadLoopTwo{publicstaticvoidmain(String[]args){//设置线程1的信号量为0CountDownLatchcOne=newCountDownLatch(0);//设置线程2的信号量为1CountDownLatchcTwo=newCountDownLatch(1);//设置线程3的信号量为1CountDownLatchcThree=newCountDownLatch(1);//因为cOne为0,t1可以直接执行Threadt1=newThread(newWork(cOne,cTwo));//线程t1执行完后,此时的cTwo为0,t2开始执行Threadt2=newThread(newWork(cTwo,cThree));//线程t2执行完毕,此时cThree为0,t3开始执行Threadt3=newThread(newWork(cThree,cThree));t1。开始();t2.start();t3.start();}staticclassWorkimplementsRunnable{CountDownLatchcOne;CountDownLatchcTwo;publicWork(CountDownLatchcOne,CountDownLatchcTwo){super();this.cOne=cOne;this.cTwo=cTwo;}@Overridepublicvoidrun(){try{//只在前一个线程信号量为0时才执行cOne.await();System.out.println("threadstart:"+Thread.currentThread().getName());//下一个线程信号量减1cTwo.countDown();}catch(InterruptedExceptione){e.printStackTrace();}}}}使用单线程池之所以不能保证线程1、2、3的执行顺序是因为编译器可能会做一些优化,导致没办法按顺序执行。如果我们使用单线程池来执行,那么就没有这个问题。具体实现:publicclassThreadLoopThree{publicstaticvoidmain(String[]args){Threadt1=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("threadstart:"+Thread.currentThread().getName()+"runone");}});Threadt2=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("threadstart:"+Thread.currentThread().getName()+"runtwo");}});Threadt3=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("threadstart:"+Thread.currentThread().getName()+"runthree");}});ExecutorServiceexecutor=Executors.newSingleThreadExecutor();//Thread依次加入线程池executor.submit(t1);executor.submit(t2);executor.submit(t3);//及时关闭线程池executor.shutdown();}}CompletableFuture如果CompletableFuture为用于实现,代码非常简洁()->t1.start()).thenRun(()->t2.start()).thenRun(()->t3.start());}staticclassWorkimplementsRunnable{@Overridepublicvoidrun(){System.out.println("threadstart:"+Thread.currentThread().getName());}}}
