2011-10-03 92 views
0

等待事件/更新的最佳方式是什么?例如,我正在等待这个数据结构在做某事之前被更新。实现这一个循环里面是不是最好的方法,因为它会消耗大量的CPU时间,如:等待更新

while (true) { 
    // keep checking the data structure 
    // if data structure is updated 
    // break; 
} 
// do something here 

什么是Java实现这样的一个简单而有效的方法?

回答

1

wait-notifyAll比循环更有效。

为等待标准成语():

synchronized (obj) { 
    while(condition not hold) 
     obj.wait(); 
} 

但它的控制线程原始的方式,你在java.util.concurrent包最好用类。而且,如果我遇到这样的问题,我会选择克里斯戴尔的答案。

1

它确实取决于程序其余部分的结构。我可能会首先查看java.util.concurrent,看看里面的东西是否适合你。你可以做到这一点的方式

例子:

  • 期货 - 如果你有一些“工作”要做,你可以有一个线程池执行服务来执行这项工作。当你致电submit()做你的工作时,你会得到一个未来,你可以检查或阻止工作完成。

  • 队列 - 如果您有一个组件正在执行此工作,并且有一个组件正在等待,您可以通过队列完成它们的通信。任何时候只要处理完数据,都可以添加到队列中。您可以使用LinkedBlockingQueue和poll()完成工作。

  • 监听器 - 如果没有并发性,您可以使用监听器/观察者模式。

根据您的应用程序结构有很多不同的选项。

+0

感谢这个信息太。 – jasonline

0

这是我会做的代码示例。

在这个逻辑中我使用线程中的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 

    } 
} 
0

假设您在应用程序中使用多线程。要在多个线程中使用一个对象,应该使用同步。当一个线程初始化数据结构时,其他等待初始化完成。这个逻辑通常使用可以在任何对象上调用的等待/通知方法来实现。

工作线程(S):

while (initialized) { 
    synchronized (object) { 
    object.wait(); 
    } 
} 

初始化线程:

synchronized (object) { 
    // initialization 
    initialized = true; 
    object.notifyAll(); 
} 

object是数据结构,其应该初始化。 initialized标志用于指示初始化已完成。最好使用此标志,因为有时wait可以在没有对应的情况下完成notify