等待事件/更新的最佳方式是什么?例如,我正在等待这个数据结构在做某事之前被更新。实现这一个循环里面是不是最好的方法,因为它会消耗大量的CPU时间,如:等待更新
while (true) {
// keep checking the data structure
// if data structure is updated
// break;
}
// do something here
什么是Java实现这样的一个简单而有效的方法?
等待事件/更新的最佳方式是什么?例如,我正在等待这个数据结构在做某事之前被更新。实现这一个循环里面是不是最好的方法,因为它会消耗大量的CPU时间,如:等待更新
while (true) {
// keep checking the data structure
// if data structure is updated
// break;
}
// do something here
什么是Java实现这样的一个简单而有效的方法?
wait-notifyAll比循环更有效。
为等待标准成语():
synchronized (obj) {
while(condition not hold)
obj.wait();
}
但它的控制线程原始的方式,你在java.util.concurrent
包最好用类。而且,如果我遇到这样的问题,我会选择克里斯戴尔的答案。
它确实取决于程序其余部分的结构。我可能会首先查看java.util.concurrent,看看里面的东西是否适合你。你可以做到这一点的方式
例子:
期货 - 如果你有一些“工作”要做,你可以有一个线程池执行服务来执行这项工作。当你致电submit()做你的工作时,你会得到一个未来,你可以检查或阻止工作完成。
队列 - 如果您有一个组件正在执行此工作,并且有一个组件正在等待,您可以通过队列完成它们的通信。任何时候只要处理完数据,都可以添加到队列中。您可以使用LinkedBlockingQueue和poll()完成工作。
监听器 - 如果没有并发性,您可以使用监听器/观察者模式。
根据您的应用程序结构有很多不同的选项。
这是我会做的代码示例。
在这个逻辑中我使用线程中的join
方法。这确保在主线程执行继续之前所有线程都已连接。我已将TODO放在需要添加代码的位置
import java.util.ArrayList;
import java.util.List;
public class MultiThread extends Thread{
public void run() {
System.out.println("Starting Thread - " + this.getName()+this.getThreadGroup());
//TODO data structure is updated here
}
public static void main(String[] args) {
List dataStructureList = new ArrayList() ;//TODO need to replace with list of data structure
//TODO dataStructureList contain list of items
Thread[] threadArr = new Thread[dataStructureList.size()];
for (int j = 0; j < threadArr.length; j++) {
threadArr[j] = new MultiThread();
threadArr[j].setName("Thread " + j);
threadArr[j].start();
}
try {
for (int j = 0; j < threadArr.length; j++) {
threadArr[j].join();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("All thread finished");
//TODO do something here
}
}
假设您在应用程序中使用多线程。要在多个线程中使用一个对象,应该使用同步。当一个线程初始化数据结构时,其他等待初始化完成。这个逻辑通常使用可以在任何对象上调用的等待/通知方法来实现。
工作线程(S):
while (initialized) {
synchronized (object) {
object.wait();
}
}
初始化线程:
synchronized (object) {
// initialization
initialized = true;
object.notifyAll();
}
object
是数据结构,其应该初始化。 initialized
标志用于指示初始化已完成。最好使用此标志,因为有时wait
可以在没有对应的情况下完成notify
。
感谢这个信息太。 – jasonline