1

在我的程序中,我有以下模板的功能:

public MyObject myMethod() {

   final MyObject[] myObject = new MyObject[]{null};
   MyListener myListener= new MyListener() {
      public void messageReceived(MyObject newData) {
         // Thread #1
         myObject[0] = newData;
      }
   }

   ...

   // Thread #2
   while (myObject[0] == null) ;
   return myObject[0];
}

不幸的是,Java 64 位线程#2 中存在同步问题,没有看到线程#1 所做的任何更改,并且while 循环永远不会结束。我应该如何同步这些线程?

谢谢!

4

3 回答 3

1

你正在忙着循环。这几乎从来都不是一个好主意。请改用阻塞数据结构,例如 BlockingQueue。收到消息后,将其放入队列中。并让您的接收者从队列中获取消息。当队列中没有消息时,接收者将被阻塞。

于 2012-05-18T10:45:18.627 回答
1

尝试使用 java.util.concurrent.ArrayBlockingQueue 而不是 Array... 那么你就不必使用 synchronized 关键字。它的线程安全。

于 2012-05-18T10:50:48.917 回答
1

您可以在两个线程中Synchronized对对象使用块myObject(因为它永远不会为空)。

synchronized(myObject) {
    ...do stuff ...
}

一个建议:不要使用while循环,而是使用wait-notify机制。

于 2012-05-18T10:59:25.647 回答