2016-03-25 24 views
1

私は、workerというスレッドの配列を持っています。 statusという別のスレッドがあります。スレッド1のスレッドが完了するまで待ちます。

どちらのスレッドも共有LinkedBlockingQueueにアクセスします。ワーカー(スレッド配列)はpoll()を使用して作業を取り込み、ステータスは30秒ごとにキューのサイズを報告します。

これを実行しているでは私の問題私は、ステータスクラスから印刷、次の取得されています

UPLOADING ...

プレビュー...

しかし、プレビューは、前に表示されますアップロードする前にのみ。 ステータスオブジェクトは、作業者の最初のバッチが完了するのを待っていないと思いますか?

DOWNLOADING ....

プレビュー....

UPLOADING ...

ではなく、物事は外のビットをされています

私はこれをしたいです同期。

// start up the Status Object class. 
     int downloadSize = filesToDownload.size(); 
     Thread statusThread = new Thread(new Status(filesToDownload, currentYear, downloadSize, "DOWNLOADING...")); 
     statusThread.start(); 

     /** 
     * download the files 
     */ 

     Thread[] workers = new Thread[NUMBER_OF_THREADS]; 
     for (int x = 0; x < NUMBER_OF_THREADS; x++) { 
      workers[x] = new Thread(new S3ObjectDownloader(filesToDownload, currentYear)); 
      workers[x].start(); 
     } 
     for (int x = 0; x < NUMBER_OF_THREADS; x++) { 
      try { 
       workers[x].join(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

     /** 
     * create previews 
     */ 
     int previewSize = filesToPreview.size(); 
     statusThread = new Thread(new Status(filesToPreview, currentYear, previewSize, "PREVIEWING...")); 
     statusThread.start(); 

     workers = new Thread[NUMBER_OF_THREADS]; 
     for (int x = 0; x < NUMBER_OF_THREADS; x++) { 
      workers[x] = new Thread(new Worker(filesToPreview, currentYear)); 
      workers[x].start(); 
     } 
     for (int x = 0; x < NUMBER_OF_THREADS; x++) { 
      try { 
       workers[x].join(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

     /** 
     * upload previews to S3. 
     */ 
     // we need the TransferManager for the uploads. 
     TransferManager txManager = new TransferManager(new ClasspathPropertiesFileCredentialsProvider()); 
     statusThread = new Thread(new Status(filesToUpload, currentYear, filesToUpload.size(), "UPLOADING...")); 
     statusThread.start(); 

     workers = new Thread[NUMBER_OF_THREADS]; 
     for (int x = 0; x < NUMBER_OF_THREADS; x++) { 
      workers[x] = new Thread(new S3ObjectUploader(filesToUpload, currentYear, txManager)); 
      workers[x].start(); 
     } 
     for (int x = 0; x < NUMBER_OF_THREADS; x++) { 
      try { 
       workers[x].join(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch 
       // block 
       e.printStackTrace(); 
      } 
     } 

     // shutdown transfer manager 
     txManager.shutdownNow(); 

ここStatus.java

public class Status implements Runnable { 

    private String conferenceYear; 
    private Queue<String>queue; 
    private int queueSize; 
    private String jobeName; 

    public Status(Queue<String> queue, String conferenceYear, int queueSize, String jobName){ 
     this.conferenceYear = conferenceYear; 
     this.queue = queue; 
     this.queueSize = queueSize; 
     this.jobeName = jobName; 
    } 

    @Override 
    public void run() { 
     while(!queue.isEmpty()){ 
      try { 
       float completion = (queue.size() * 1.0f)/this.queueSize; 
       System.out.println(this.jobeName+" : "+this.conferenceYear+ " remaining..."+MessageFormat.format("{0,number,#.##%}",completion)); 
       TimeUnit.SECONDS.sleep(30);; 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 

} 

答えて

1

があるJavaは、このようなシナリオをサポートするためにCountDownlatchesを持っています。

CountDownLatchクラスをご覧ください。

このリンクには、わかりやすいサンプル実装も含まれています。それぞれのタスクの開始を知らせるラッチを作成し、終了を待つことができます。

+0

その仕事をした!ありがとう! –

関連する問題