【发布时间】:2011-12-21 19:55:03
【问题描述】:
在线程间通信方面遇到问题,并通过到处使用“虚拟消息”来“解决”它。这是一个坏主意吗?有哪些可能的解决方案?
我遇到的示例问题。
主线程启动一个线程来处理和插入数据库中的记录。 主线程读取一个可能很大的文件并将一个记录(对象)一个接一个地放入阻塞队列中。处理线程从队列中读取并开始工作。
如何告诉“处理线程”停止? 队列可以是空的,但工作没有完成,当处理线程完成工作并且不能中断它时,主线程现在也没有。
处理线程确实如此
while (queue.size() > 0 || !Thread.currentThread().isInterrupted()) {
MyObject object= queue.poll(100, TimeUnit.MILLISECONDS);
if (object != null) {
String data = object.getData();
if (data.equals("END")) {
break;
}
// do work
}
}
// clean-up
synchronized queue) {
queue.notifyAll();
}
return;
和主线程
// ...start processing thread...
while(reader.hasNext(){
// ...read whole file and put data in queue...
}
MyObject dummy = new MyObject();
dummy.setData("END");
queue.put(dummy);
//Note: empty queue here means work is done
while (queue.size() > 0) {
synchronized (queue) {
queue.wait(500); // over-cautios locking prevention i guess
}
}
注意插入必须在同一个事务中,不能处理事务 通过主线程。
有什么更好的方法来做到这一点? (我正在学习,不想开始“做错事”)
【问题讨论】:
标签: java concurrency producer-consumer