按照启动顺序完成线程

时间:2012-02-28 17:09:51

标签: java android

我在单独的线程中同时下载了几个图像。我需要将这些图像设置为适配器。我需要按照它们启动的顺序完成这些线程,因为我使用回调来通知适配器和....我怎么能这样做(按照它们的启动顺序完成线程)?

4 个答案:

答案 0 :(得分:1)

你可以写一个类说Mediator,将同一个类实例传递给所有线程。当线程完成下载后,他们会通过调用某个方法通知Mediator,比如说下载完成(线程ID),调解员将跟踪这些线程的排序并回调。

答案 1 :(得分:1)

听起来您可能不一定关心任务完成的顺序,而是想要控制处理结果的顺序。

如果您将Runnable提交给ExecutorService,您将获得Future对象。然后你可以使用Future对象的#get()方法http://developer.android.com/reference/java/util/concurrent/Future.html#get(),按顺序等待每个线程的结果。

如果使用AsyncTask执行每个线程,则可以使用AsyncTask的#get()方法,http://developer.android.com/reference/android/os/AsyncTask.html#get()。

这是一个代码示例:

int time = nbrOfThreads;

List<AsyncTask<Integer, Void, Integer>> tasks = new ArrayList<AsyncTask<Integer, Void, Integer>>();
for (int i = 0; i < nbrOfThreads; i++) {
    final int threadNumber = i;

    AsyncTask<Integer, Void, Integer> task = new AsyncTask<Integer, Void, Integer>() {

        @Override
        protected Integer doInBackground(Integer... secondsToSleep) {
            try {
                Thread.sleep(secondsToSleep[0] * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return threadNumber;
        }
    };

    tasks.add(i, task);
    task.execute(time--);
}

for (AsyncTask<Integer, Void, Integer> task : tasks) {
    print("Thread number: " + task.get() + " completed.");
}

答案 2 :(得分:0)

以特定顺序完成线程与多线程编程的想法背道而驰......你不想启动线程1,2和3,然后决定它们何时完成,因为它们可能有任务需要完全不同的时间来完成。

例如,如果您在两个不同的线程上下载两个不同的东西,如果线程1正在下载2 TB文件而线程2正在下载2 KB文件怎么办?显然,线程2将在线程1之前完成,并且您不希望您的进程必须阻止等待线程1完成...我建议重新思考您要完成的任务并相应地重新设计以避免此

答案 3 :(得分:0)

按顺序完成线程可能不是你真正想要的 - 它将是一个相当人为的构造。我认为你真正想要的是一个所谓的障碍,这意味着让线程运行,然后等待所有线程完成。之后,您可以调用一些代码(可能来自您的主线程)以按您需要的顺序处理结果。为了等待所有线程完成,只需在所有线程上调用join(),如下所示(为清晰起见,跳过错误处理):

//Create and start workers asynchronously
Thread[] workers = new Thread[NUM];
for (int i = 0; i < workers.length; i++) {
    workers[i] = new MyWorkerThread(dataSlice[i]);
    workers[i].start();
}
//Barrier - wait till all threads are done
for (int i = 0; i < workers.length; i++) {
    workers[i].join();
}
//Loop over generated results in some order, here reversed order just for fun
for (int i = workers.length; i > 0; i--) {
    soSomething(dataSlice[i]);
}