替换等待并在java中通知

时间:2014-09-10 11:19:40

标签: java synchronization wait notify

java中有wait / notify的替代吗?

我有两个主题:

thread1:
run() {
 while(true) {      
  data = getDataFromDatabase()
  changedData = performSomeChanges(data)
  commitUpdateDataToDatabase(changedDate)
  (send signal to thread2 to start and wait for signal for next repetition)
 }  
}

thread2:
run() {
 while(true) {      
  (wait for signal from thread1)
  data = getDataFromDatabase()
  changedData = performSomeChanges(data)
  commitUpdateDataToDatabase(changedDate)
  (send signal to thread1)      
 }  
}

我希望他们之间有某种同步。现在我为特殊的公共对象使用wait / notify。

2 个答案:

答案 0 :(得分:2)

首先,实现示例的简单方法只使用一个线程:

run() {
    while(true) {
        // old thread 1 code      
        data = getDataFromDatabase()
        changedData = performSomeChanges(data)
        commitUpdateDataToDatabase(changedDate)
        // old thread 2 code
        data = getDataFromDatabase()
        changedData = performSomeChanges(data)
        commitUpdateDataToDatabase(changedDate)
    }  
}

在两个线程之间执行交替没有明显的(对我而言)优势。还有一些明显的缺点;即复杂性,以及同步和线程切换的(微小的)性能损失。


但是假设你确实有合理的理由在两个线程之间交替,那么有很多方法可以做到:

  • 正如您目前所做的那样使用waitnotify ... (IMO,没有真正的需要来寻找替代方案。如果使用得当,它们的工作正常!不可否认,一些Java程序员还没有掌握这个......)

    < / LI>
  • 使用java.util.concurrent.Semaphore并让每个线程在获取和释放之间交替。

  • 使用java.util.concurrent.Lock和锁的交替所有权。

  • 使用BlockingQueue并传递&#34;令牌&#34;对象来回。

  • 等等

答案 1 :(得分:0)

有无数的方法可以做到。

例如,您可以使用ReentrantLock或CountDownLatch或ArrayBlocking或ArrayBlockingQueue

PS:wait / notify有什么问题?为什么你想要别的东西?