2
回答
ExecutorService.shutdownNow()方法关不掉怎么办啊?
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

我的程序需要挺多个runnable一直在跑(死循环),直到被关掉为止。所以用ThreadPool方便管理线程,但是想关掉所有进程时却关不掉。做了个小程序试验了一下,却发现shutdonwNow一点都没用啊....救救我please
我也听说shutdownNow方法是试图关闭所有线程,而不能强制关闭。。这个问题这么决绝a?

package poolTest;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPool {

	public static void main(String[]a){
		ExecutorService pool = Executors.newCachedThreadPool();
		Runnable runnable = new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				int i=1;
				while(true){
					System.out.println(i++);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		};
		
		pool.submit(runnable);
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		pool.shutdownNow();
	}
}

举报
leo-H
发帖于6年前 2回/5K+阅
共有2个答案 最后回答: 3年前

我想了个很蠢的方法。。。因为我的runnable死循环里一般有Thread.sleep延时,所以在它的异常处理中设置标志。但这种方法不利于runnable的编写啊,总要考虑在哪里插入一个标志信息

package poolTest;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import com.sun.org.apache.xml.internal.utils.StopParseException;

public class ThreadPool {

	public static void main(String[]a){
		ExecutorService pool = Executors.newCachedThreadPool();
		Runnable runnable = new Runnable() {
			
			@Override
			public void run() {
				int i=1;
				//here
				boolean stop = false;
				while(!stop){
					System.out.println(i++);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
						// and here
						stop = true;
					}
					
				}
			}
		};
		
		pool.submit(runnable);
		try {
			Thread.sleep(3023);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		pool.shutdownNow();
	}
}

这样shutdownNow调用时,程序如果正好执行到到Thread.sleep,就会把它关闭。这并不是足够好的方法

--- 共有 1 条评论 ---
hongliuliao好像也只有这么处理了... 5年前 回复

线程中断是一种协作机制,线程可以通过这种机制来通知另一个线程.告诉它在适当的或者可能的情况下停止当前工作,并转而执行其他操作. 调用了interrupt 并不意味着立刻停止目标线程正在进行的操作,而只是传递了请求中断的消息.

你的问题是:run()方法中,截获了InterruptedException 异常但是没有做异常处理,仅仅是打印出来,那肯定是不会停止啦.

解决办法:

catch(InterruptedException e) {
                        // TODO Auto-generated catch block

                        e.printStackTrace();

                        break;

                    }

顶部