beg*_*er_ 6 java concurrency producer-consumer
线程间通信有问题,并通过在整个地方使用"虚拟消息"来"解决"它.这是一个坏主意吗?有哪些可能的解决方案
示例问题我有.
主线程启动一个线程进行处理并将记录插入数据库.主线程读取一个可能很大的文件,并将一个记录(对象)放在一个阻塞队列中.处理线程从队列中读取并确实有效.
如何告诉"处理线程"停止?队列可以是空的但是工作没有完成,主线程现在也没有处理线程完成工作并且不能中断它.
所以处理线程呢
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;
Run Code Online (Sandbox Code Playgroud)
和主线程
// ...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
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,插入必须位于同一事务中,并且主线程无法处理事务.
这会是一个更好的方法吗?(我正在学习,不想开始"以错误的方式做")
这些虚拟消息是有效的。谓之“毒”。生产者发送给消费者以使其停止的东西。
另一种可能性是在主线程中的某个位置调用 Thread.interrupt() ,并在工作线程中相应地捕获并处理 InterruptedException 。
归档时间: |
|
查看次数: |
1583 次 |
最近记录: |