Java主線程在子線程執行完畢后再執行


一、join()

Thread中的join()方法就是同步,它使得線程之間由並行執行變為串行執行。

public class MyJoinTest { public static void main(String[] args) { Vector<Thread> threadVector = new Vector<Thread>(); for (int i = 0;i<5;i++){ Thread childThread = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("子線程執行..."); } }); threadVector.add(childThread); childThread.start(); } for (Thread t : threadVector){ try { t.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("主線程執行......"); } }

我們使用循環創建了5個子線程,把它們放到Vector對象中,並啟動這個線程。遍歷Vector,獲取每一個子線程。在main線程中調用子線程的join方法,那么main線程放棄cpu的使用權,直到所有的子線程執行完畢,才會執行main線程。執行結果如下:

子線程執行...
子線程執行...
子線程執行...
子線程執行...
子線程執行...
主線程執行......

二、CountDownLatch

public class CountDownLatchTest { public static void main(String[] args) { final CountDownLatch latch = new CountDownLatch(5); for (int i = 0; i < 5; i++) { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("子線程執行..."); latch.countDown();//讓latch中的值減1
 } }).start(); } try { latch.await();//阻塞當前線程,直到latch的值為0
        } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("主線程執行......"); } }

三、CyclicBarrier

public class CyclicBarrierTest { public static void main(String[] args) throws BrokenBarrierException, InterruptedException { final CyclicBarrier barrier = new CyclicBarrier(5); for (int i = 0; i < 4; i++) { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("子線程執行..."); try { barrier.await();//到達屏障
                    } catch (Exception e) { e.printStackTrace(); } } }).start(); } barrier.await(); System.out.println("主線程執行......"); } }
CountDownLatchCyclicBarrier有什么區別呢?
他們的區別:
CountDownLatch只能使用一次,而CyclicBarrier方法可以使用reset()方法重置,所以CyclicBarrier方法可以處理更為復雜的業務場景。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM