2014-09-10 137 views
-1

在java中有没有等待/通知的替代品?替代等待,并在java中通知

我有两个线程:

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)  
} 
} 

,我想有某种它们之间synchranization的。现在我为此使用特殊通用对象的等待/通知。

+1

不会观察者模式解决您的问题?而不必依赖于同步?或者某种未来可能会派上用场? – 2014-09-10 11:23:40

+2

你有没有理由不能使用'wait'和'notify'? – 2014-09-10 11:38:13

回答

0

有无数的方法来做到这一点。

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

PS:有什么不对的等待/通知?为什么你想要别的东西?

+0

wait/notify机制相当麻烦,如果可能的话,我宁愿使用Java公开的新API:ExecutorService,Future等。[链接](http://www.javaworld.com/article/2078809/java -concurrencyava-101-the-next-generation-java -c/java-concurrency/java-101-the-next-generation-java-concurrency-without-the-pain-part-1.html) – 2014-09-10 11:32:19

+0

你的意思是越野车?我知道新的API。 – talex 2014-09-10 11:36:08

+0

现在很多依赖Thread操作的Java应用程序中的大部分问题都来自于wait/notify/synchronized的不当使用 – 2014-09-10 11:37:14

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程序员还没有掌握这...)

  • 使用java.util.concurrent.Semaphore且每个线程交替在获取和释放之间。使用java.util.concurrent.Lock并交替锁定所有权。

  • 使用BlockingQueue并来回传递“令牌”对象。

  • 等等