2016-03-25 32 views
1

Ben işçiler denilen bir dizi konu var. Durum adı verilen başka bir konu daha var.1 1 Konu yapmak için bir dizi konu için bekleyin Konu başlıkları

Her iki ileti paylaşılan bir LinkedBlockingQueue'ya erişir. İşçiler (iş parçacığı dizisi), iş ve durum raporlarını her 30 saniyede bir sıranın boyutunu almak için poll() yöntemini kullanır. Bu çalışan

Sorunum durum sınıfından basılmış aşağıdaki olsun geçerli:

önizlenirken ... ...

YÜKLEME

Ama önizleme yapmadan önce görünmelidir, ve sadece önce, UPLOADING. Yani, durum nesnesinin işçilerin ilk parti işini tamamlamasını beklemiyor muyum?

İNDİRME ....

önizlenirken ....

YÜKLEME ...

ancak bunun yerine şeyler dışında biraz gibidir:

Şunu istiyorum senkron.

// 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(); 

Aşağıda Java tür senaryoları desteklemek için CountDownlatches vardır 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(); 
      } 
     } 

    } 

} 

cevap

1

olduğunu.

CountDownLatch sınıfına bir göz atın. Bağlantı ayrıca anlaşılması çok kolay olan örnek bir uygulama içermektedir. Başlama sinyali vermek ve görevinizin her biri için sonu beklemek için mandallar oluşturabilirsiniz. İşi yapan

+0

! Teşekkürler! –