私は、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();
}
}
}
}
その仕事をした!ありがとう! –