How to know if other threads have finished?

前端 未结 12 1875
野性不改
野性不改 2020-11-22 14:05

I have an object with a method named StartDownload(), that starts three threads.

How do I get a notification when each thread has finished executing?

12条回答
  •  日久生厌
    2020-11-22 14:29

    Solution using CyclicBarrier

    public class Downloader {
      private CyclicBarrier barrier;
      private final static int NUMBER_OF_DOWNLOADING_THREADS;
    
      private DownloadingThread extends Thread {
        private final String url;
        public DownloadingThread(String url) {
          super();
          this.url = url;
        }
        @Override
        public void run() {
          barrier.await(); // label1
          download(url);
          barrier.await(); // label2
        }
      }
      public void startDownload() {
        // plus one for the main thread of execution
        barrier = new CyclicBarrier(NUMBER_OF_DOWNLOADING_THREADS + 1); // label0
        for (int i = 0; i < NUMBER_OF_DOWNLOADING_THREADS; i++) {
          new DownloadingThread("http://www.flickr.com/someUser/pic" + i + ".jpg").start();
        }
        barrier.await(); // label3
        displayMessage("Please wait...");
        barrier.await(); // label4
        displayMessage("Finished");
      }
    }
    

    label0 - cyclic barrier is created with number of parties equal to the number of executing threads plus one for the main thread of execution (in which startDownload() is being executed)

    label 1 - n-th DownloadingThread enters the waiting room

    label 3 - NUMBER_OF_DOWNLOADING_THREADS have entered the waiting room. Main thread of execution releases them to start doing their downloading jobs in more or less the same time

    label 4 - main thread of execution enters the waiting room. This is the 'trickiest' part of the code to understand. It doesn't matter which thread will enter the waiting room for the second time. It is important that whatever thread enters the room last ensures that all the other downloading threads have finished their downloading jobs.

    label 2 - n-th DownloadingThread has finished its downloading job and enters the waiting room. If it is the last one i.e. already NUMBER_OF_DOWNLOADING_THREADS have entered it, including the main thread of execution, main thread will continue its execution only when all the other threads have finished downloading.

提交回复
热议问题