Java While(true)线程清理

时间:2018-06-06 15:45:21

标签: java multithreading

我在线程应用程序中清理线程时遇到问题。我有各种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);

1 个答案:

答案 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();
    }
}
相关问题