//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]);
}
# 1 楼答案
听起来您可能并不一定关心任务完成的顺序,而是希望控制处理结果的顺序
如果您将Runnable提交给ExecutorService,您将获得一个将来的对象。然后可以使用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()
下面是一个代码示例:
# 2 楼答案
按特定顺序完成线程与多线程编程的思想背道而驰。。。您不希望启动线程1、2和3,然后指定它们何时完成,因为它们可能有需要完全不同时间才能完成的任务
例如,如果您正在两个不同的线程上下载两个不同的东西,那么如果线程1正在下载一个2 TB的文件,而线程2正在下载一个2 KB的文件,该怎么办?显然,线程2将在线程1之前很久完成,并且您不希望您的进程必须阻止等待线程1完成。。。我建议您重新思考您试图实现的目标,并相应地重新设计以避免出现这种情况
# 3 楼答案
您可以编写一个类,比如Mediator,将同一个类实例传递给所有线程。当线程完成下载时,他们将通过调用某种方法(比如downloadComplete(线程id))通知中介器,中介器将跟踪这些线程的顺序并进行回调
# 4 楼答案
按顺序完成线程可能不是您真正想要的-这将是一个相当人工的构造。我认为您可能真正想要的是一个所谓的屏障,即让线程运行,然后等待所有线程完成。之后,您可以调用一些代码(可能来自主线程)以按需要的顺序处理结果。为了等待所有线程完成,只需对所有线程调用
join()
,如下所示(为了清楚起见,跳过了错误处理):