当我在Eclipse中测试我的代码时,我在控制台中停止了该程序,但我发现线程仍在继续工作。我正在尝试创建一个管道,以便为我们不断传入的数据进行操作。当我停止程序时,如何关闭所有正在运行的线程?
(特别是当我使用无限循环时)
这是我的主要内容:
public static void main(String[] args) {
queue = new ArrayBlockingQueue<StreamQueueItem>(100);
LogFileProcessor threadFileProcessor = new LogFileProcessor(queue);
new Thread(threadFileProcessor).start();
StreamCoordinator threadStreamCoordinator = new StreamCoordinator(queue);
new Thread(threadStreamCoordinator).start();
}
基本上第一个线程是将BlockingQueue排队,第二个线程将弹出项目保留在队列之外,然后选择请求发送者发送请求。
StreamCoordinator的代码:
public StreamCoordinator(BlockingQueue<StreamQueueItem> mQueue) {
super();
this.mQueue = mQueue;
this.mThreadPool = Executors.newFixedThreadPool(ConfigConstants.SENDER_THREDPOOL_SIZE);
mBqHelper = new BigqueryHelper(ConfigConstants.PROJECT_ID,ConfigConstants.DATA_SET, ConfigConstants.TABLE_EXISTS);
}
@Override
public void run() {
StreamQueueItem item = null;
while(true){
//wait 1 second for next request
try {
Thread.sleep(1 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
item = mQueue.poll();
if( item != null){
mThreadPool.execute(new RequestSender(mBqHelper,item));
}
}
}
RequestSender:
@Override
public void run() {
System.out.format("%d is sending request %s . List size: %d %s\n",mSenderId,FormatHelper.currentDate(),mRequestItem.getRowList().size(),mRequestItem.getLogReason().getTableName());
mBqHelper.submitStreamRequest(mRequestItem.getLogReason().getTableName(), mRequestItem.getRowList());
System.out.println("# " + mSenderId + " done. " + FormatHelper.currentDate());
}
答案 0 :(得分:0)
这是邪恶的代码:
} catch (InterruptedException e) {
e.printStackTrace();
}
如果您发现InterruptedException
,必须正确处理它。记录它并忽略它将导致您的程序行为不端。如果告诉你的线程它需要停止(即你按下红色按钮),那个例外是运行时的方式。
尝试对异常做出适当的反应:
} catch (InterruptedException e) {
return;
}
这是一篇关于这个主题的优秀文章,非常值得一读:Java theory and practice: Dealing with InterruptedException