考虑以下类:
public class TaskWorkDemo {
private final Object mLock = new Object();
private final ArrayDeque<String> mQueue = new ArrayDeque<String>();
private Thread mThread;
private String getOne(){
synchronized (mLock){
return mQueue.isEmpty() ? null : mQueue.peek();
}
}
//--produce--
private void putOne(String s){
synchronized (mLock){
mQueue.offer(s);
}
//-- at time T --
if(mThread == null || !mThread.isAlive()){
mThread = new Thread(new Runner());
mThread.start();
}
}
private class Runner implements Runnable{
//--consume--
@Override
public void run() {
String s = getOne();
while (s != null){
System.out.println(s);
s = getOne();
}
//-- at time T --
mThread = null;
}
}
}
只有当队列中有待处理的字符串时,消费者线程才应该存在,即不像我们看到的典型用法那样在队列中等待。因此,我试图在每次将某些内容添加到队列时创建一个线程,方法是检查任何先前的线程是否不存在或已完成。
但是这种方法有一个极端情况(见//-- at time T --
上面的代码):消费者线程已经退出循环,但还没有完成。生产者线程即将检查之前的消费者线程是否还在,它会发现它还在结束,并跳过创建一个新线程。
有任何想法吗 ?