歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java多線程問題之同步器CyclicBarrier

還是上次的Oracle遷移到mysql的遺留問題(見 http://www.linuxidc.com/Linux/2012-06/61668.htm ),當我在查看數據的時候,發現兩個庫數據量不一致。最後證實了我的看法,我修改代碼時將10個進程簡成1個單線程來完成了。所以數據量會少那麼多呢。

原因很簡單當時就是這個函數CyclicBarrier,當時不理解具體的意思:

  1. if (sessionParameter.getSourceThreadNum() > 1) {  
  2.                 System.out.println("多線程運行");  
  3.                 CyclicBarrier barrier = new CyclicBarrier(sessionParameter  
  4.                         .getSourceThreadNum() + 2);  
  5.                 for (int i = 0; i <= sessionParameter.getSourceThreadNum(); i++) {  
  6.                     dataSyncThread dataSync = new dataSyncThread(barrier, i,  
  7.                             sDataSource, tDataSource, sessionParameter);  
  8.                     dataSync.start();  
  9.                 }  
  10.                 long start = System.currentTimeMillis();  
  11.                 barrier.await();  
  12.                 barrier.await();  
  13.                 long end = System.currentTimeMillis();  

在實際應用中,有時候需要多個線程同時工作以完成同一件事情,而且在完成過程中,往往會等待其他線程都完成某一階段後再執行,等所有線程都到達某一個階段後再統一執行。 其中,的barrier就是相當於一個阻斷,障礙器,CyclicBarrier最重要的屬性就是參與者個數,另外最要方法是await()。當所有線程都調用了await()後,就表示這些線程都可以繼續執行,否則就會等待。只有達到CyclicBarrier(int number)中number的數量,才能使程序中的10個進程同步進行互不干擾。

Copyright © Linux教程網 All Rights Reserved