Java 如何用future中断一个线程,想通过future发出的中断来执行一些任务
我不熟悉java中的未来和多线程。我有一个简单的问题,后来证明是复杂的,我有很多线程(其中都有打开的会话),它们是无限打开的。每当一个线程抛出自定义异常(会话超时异常)时,我必须中断所有线程并优雅地关闭所有会话。我所做的是存储线程返回的future对象(在ArrayList中),并在其中循环,当一个线程抛出异常时,发出future.cancel for allJava 如何用future中断一个线程,想通过future发出的中断来执行一些任务,java,multithreading,future,cancellation,interrupted-exception,Java,Multithreading,Future,Cancellation,Interrupted Exception,我不熟悉java中的未来和多线程。我有一个简单的问题,后来证明是复杂的,我有很多线程(其中都有打开的会话),它们是无限打开的。每当一个线程抛出自定义异常(会话超时异常)时,我必须中断所有线程并优雅地关闭所有会话。我所做的是存储线程返回的future对象(在ArrayList中),并在其中循环,当一个线程抛出异常时,发出future.cancel for all private static void futureCancel() { for(int i=0;i<number
private static void futureCancel()
{
for(int i=0;i<numberStreams;i++)
{
Future<String> future=futureList.get(i);
try{
future.cancel(true);
future.get();
}
catch(InterruptedException e)
{
System.out.println("In interrupted block!");
} catch (ExecutionException e) {
e.printStackTrace();
}
}
return;
}
private static void futureCancel()
{
对于(int i=0;i
如果我从callable中抛出InterruptedException,它不会到达上面指定的catch块
不会的。InterruptedException
catch块围绕future.get()
是当调用get的线程被中断时,而不是可调用的
如果您的Callable
被中断并抛出InterruptedException
,那么当您调用get()
时,它将进入ExecutionException
,并且e.getCause()
应该是InterruptedException
如果我从callable中抛出InterruptedException,它不会到达上面指定的catch块
不会的。InterruptedException
catch块围绕future.get()
是当调用get的线程被中断时,而不是可调用的
如果您的Callable
被中断并抛出InterruptedException
,那么当您调用get()
时,它将进入ExecutionException
,并且e.getCause()
应该是InterruptedException
如果我从callable中抛出InterruptedException,它不会到达上面指定的catch块
不会的。InterruptedException
catch块围绕future.get()
是当调用get的线程被中断时,而不是可调用的
如果您的Callable
被中断并抛出InterruptedException
,那么当您调用get()
时,它将进入ExecutionException
,并且e.getCause()
应该是InterruptedException
如果我从callable中抛出InterruptedException,它不会到达上面指定的catch块
不会的。InterruptedException
catch块围绕future.get()
是当调用get的线程被中断时,而不是可调用的
如果您的Callable
被中断并抛出InterruptedException
,那么当您调用get()
时,它将进入ExecutionException
,并且e.getCause()
应该是InterruptedException
状态
如果任务已完成,则此尝试将失败
已取消,或由于其他原因无法取消。如果
成功,并且调用cancel时此任务尚未启动,此
任务不应运行。如果任务已启动,则
MayInterruptFrunning参数确定线程
应中断执行此任务,以尝试停止
任务
因此,ExecutorService
没有执行Runnable
/Callable
并可以将其从队列中删除,或者它已经执行了,ExecutorService
必须调用线程中断()
,您的Runnable
/Callable
代码必须处理它
没有其他方法可以通过Future
接口中断线程。如果Runnable
没有处理中断的方法,那么可能会发生很多事情。如果发生InterruptedException
,它将冒泡到ExecutorService
,并被包装在ExecutionException
这将从Future#get()
抛出。如果执行Runnable
的线程中没有发生InterruptedException
,您的Runnable
将不受阻碍地继续
您应该考虑更改<代码> Runnaby<代码>以处理中断。
状态
如果任务已完成,则此尝试将失败
已取消,或由于其他原因无法取消。如果
成功,并且调用cancel时此任务尚未启动,此
任务不应运行。如果任务已启动,则
MayInterruptFrunning参数确定线程
应中断执行此任务,以尝试停止
任务
因此,ExecutorService
没有执行Runnable
/Callable
并可以将其从队列中删除,或者它已经执行了,ExecutorService
必须调用线程中断()
,您的Runnable
/Callable
代码必须处理它
没有其他方法可以通过Future
接口中断线程。如果Runnable
没有处理中断的方法,那么可能会发生很多事情。如果发生InterruptedException
,它将冒泡到ExecutorService
,并被包装在ExecutionException
这将从Future#get()
抛出。如果执行Runnable
的线程中没有发生InterruptedException
,您的Runnable
将不受阻碍地继续
您应该考虑更改<代码> Runnaby<代码>以处理中断。
状态
如果任务已完成,则此尝试将失败
已取消,或由于其他原因无法取消。如果
成功,及