我绝对处于并发地狱中。我无法为我正在尝试做的事情找到一个好的/有效的解决方案。我有一个生产者线程正在读取文本文件并将信息放入共享的 BlockedQueue。我有一个消费者,它使用共享的 BlockedQueue 来读取数据并对数据进行繁重的处理。我有一个带有三个按钮的 GUI:Start、Pause和Stop。
Producer 和 Consumer 都实现 Runnable 并提供方法来访问有关每个计算的信息(例如返回一些统计信息或一些对象)
使用Start选项,我希望 Producer 打开一个文件并开始将数据放入 BlockedQueue。消费者也开始获取数据并进行计算。
使用Pause选项,我希望 Producer 停止将数据放入 BlockedQueue,但同时我希望能够访问 Producer 的实例变量。消费者也是如此,我想停止做繁重的工作,但仍然能够访问消费者中定义的一些实例变量和方法。
使用Stop选项,我希望 Producer 和 Consumer 重置 ... 即好像从干净开始。
我的问题是如何有效地实现这一点?特别是检查暂停?
这样的伪代码会有效吗?
Enum state;
class Producer implements Runnable {
public List someList;//accessed from the event-dispatching thread
public void Run() {
synchronized(state) {
if(state == Enum.paused) {
//do nothing
}
else if(state == Enum.running) {
//put stuff into BlockedQueue
}
else if (state == Enum.stopped) {
// reopen file and set state = running
}
}
}
}
class Consumer implements Runnable {
public Map someMap;//accessed from the event-dispatching thread
public void Run() {
synchronized(state) {
if(state == Enum.paused) {
//do nothing
}
else if(state == Enum.running) {
//start consuming from the BlockedQueue and do heavy computation
}
else if (state == Enum.stopped) {
// clear stuff to start clean and set state = running
}
}
}
}