繁体   English   中英

使 1 个线程等待一组线程完成

[英]Make 1 Thread wait for an array of Threads to complete

我有一个名为 worker 的线程数组。 还有另一个单独的线程称为状态。

两个线程都访问共享的 LinkedBlockingQueue。 Workers(thread array) 使用 poll() 来拉取工作,状态每 30 秒报告一次队列的大小。

我运行这个的问题是我从状态类中打印出以下内容:

正在上传...

预览中...

但是预览应该出现在上传之前,并且只出现在上传之前。 所以,我想我的状态对象不是在等待第一批工人完成吗?

我要这个:

正在下载....

预览中....

正在上传...

但事情有点不同步。

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

    }

}

Java 有 CountDownlatches 来支持这样的场景。

看看CountDownLatch类。

该链接还包含一个非常容易理解的示例实现。 您可以创建锁存器来表示每个任务的开始和等待结束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM