我在线程应用程序中清理线程时遇到问题。我有各种runnables使用线程池启动。这些线程中的大多数是普通的可运行的,只能在预定的固定速率上执行一次。我有两个计划运行一次并在其中有一个while(true)循环。当我清理线程时,我似乎无法在其中包含while循环的线程上调用ScheduledFuture.close(false)。它们似乎没有关闭。
带有while循环的这些线程的格式示例如下:
public void run()
{
while (true)
{
QueryItem qi = null;
String query = null;
try
{
// This is a BlockingQueue!
qi = (QueryItem) FB2DatabaseRecorder.dbProcQueue.take();
query = qi.getQuery();
} catch (InterruptedException e)
{
errorLog.error("Unable to fetch message from message processing queue.");
}
// DO SOME STUFF
}
}
当我尝试在此线程上执行.close()时,它通常位于阻塞队列中,等待项目进入。在关闭线程之前,我确保刷新队列,以免留下任何数据。
有没有更好的方法来关闭这种类型的线程?好像它只是没有死于handle.close(false);
答案 0 :(得分:1)
关闭工作线程的更好方法是使用Thread.interrupt()
。
您的工作线程正在等待take
调用,如果线程被中断,take
调用将被抛出。您可以发送interrupt
并在catch
子句中管理关闭。在代码中,
package stackOv;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
class MyQueueWorker implements Runnable {
private BlockingQueue<Object> q;
MyQueueWorker(BlockingQueue<Object> q) {
this.q = q;
}
@Override
public void run() {
while (true) {
try {
Object item = q.take();
// work here
System.out.println("obj=" + item);
} catch (InterruptedException e) {
System.out.println("worker thread is interrupted");
break;
}
}
System.out.println("interrupted, exiting worker thread");
}
}
public class InterruptTake {
public static void main(String[] args) throws Exception {
BlockingQueue<Object> q = new LinkedBlockingQueue<>();
Thread worker = new Thread( new MyQueueWorker(q ), "worker" );
worker.start();
q.put("hello");
q.put("world");
q.put("waiting..");
Thread.sleep(1000);
worker.interrupt();
}
}