Java 如何用future中断一个线程,想通过future发出的中断来执行一些任务

Java 如何用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

我不熟悉java中的未来和多线程。我有一个简单的问题,后来证明是复杂的,我有很多线程(其中都有打开的会话),它们是无限打开的。每当一个线程抛出自定义异常(会话超时异常)时,我必须中断所有线程并优雅地关闭所有会话。我所做的是存储线程返回的future对象(在ArrayList中),并在其中循环,当一个线程抛出异常时,发出future.cancel for all

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<代码>以处理中断。

状态

如果任务已完成,则此尝试将失败 已取消,或由于其他原因无法取消。如果 成功,及