作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我理解同步的概念,但我现在确定为什么要以这种方式实现它,所以我需要一些帮助:
我有 2 个线程:
PeriodicalThread
将定期接收数据(假设每 5 秒)并将其放入 Queue
(暂时使用 ArrayDeque
,但是我不知道是否还有其他 Queue
实现会更好)
ProccessThread
会不断检查 Queue
是否为空。如果它不为空,它将处理数据(FIFO)。
所以,一开始我的实现是:
// Both threads are inner class so they have access to Queue
private Queue queue;
private boolean isReadyToProccess;
class PeriodicalThread extends Thread {
public void run() {
while(true) {
if(isNewDataAvailable) {
// create Data object
queue.add(data);
}
}
}
}
class ProcessThread extends Thread {
public void run() {
while(true) {
if(!queue.isEmpty() && isReadyToProccess) {
Data data = queue.poll();
processData(data);
}
}
}
}
private void processData(Data data) {
// this method send data over network, and the server response callback
// changes isReadyToProcess value to true.
}
然后当想要处理同步时,我不知道我是否应该使用lock
对象(以及它是如何实现的)或者是否已经有一个包Queue
实现是线程安全的(因为 add()
和 poll()
方法)
编辑:我忘记了标志 isReadyToProcess
指示下一个队列 Data
对象是......好吧,准备好被处理。此标志也应同步。
最佳答案
ArrayDeque
不支持并发。相反,使用支持并发工作的真实队列,如 BlockingQueue
及其在 java.util.concurrent
包中的实现之一。我建议使用 LinkedBlockingQueue
.
如果您需要在线程之间共享标志,最好使用 AtomicBoolean
而不是手动同步原始 boolean
字段。
注意:如果您将使用并发进程,最好使用java.util.concurrent
提供的类。已经支持开箱即用的锁定和同步的软件包。
关于java - 在多个线程上同步Java中的队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24085571/
我是一名优秀的程序员,十分优秀!