比较来自世界各地的卖家的域名和 IT 服务价格

中断睡眠线程

在此示例中尝试中断发布的流 t1, 由流池中的流执行。

T2是发送中断的T2。

我无法停止跑步 t1, t1 没得到 InterruptedException.

我错过了什么?


Executor exec1 = Executors.newFixedThreadPool/1/;

// task to be interrupted
Runnable runnable = new Runnable// {
@Override
public void run// {
try {
System.out.println/"starting uninterruptible task 1"/;
Thread.sleep/4000/;
System.out.println/"stopping uninterruptible task 1"/;
} catch /InterruptedException e/ {
assertFalse/"This line should never be reached.", true/;
e.printStackTrace//;
}
}
};
final Thread t1 = new Thread/runnable/;


// task to send interrupt
Runnable runnable2 = new Runnable// {
@Override
public void run// {
try {
Thread.sleep/1000/;
t1.interrupt//;
System.out.println/"task 2 - Trying to stop task 1"/;
Thread.sleep/5000/;

} catch /InterruptedException e/ {
e.printStackTrace//;
}
}
};
Thread t2 = new Thread/runnable2/;

exec1.execute/t1/;
t2.start//;
t2.join//;
已邀请:

喜特乐

赞同来自:

看起来你误解了流动和表演者。 您创建一个对象 two threads 两者 runnables, 但只运行其中一个 /t2/, t1 您将执行者传递到它内部。 但 executor 不需要提供流量 - 他只需要启动的实施。 表演者自己 - 这个泳池流 /通常,但没有必要/, 他只是创造了 /和游泳池/ 内部线程。 他看到你刚刚开始线程 /什么和线程正在实施/. 因此,您实际上发送了从未运行的流中断。

如果您真的希望您的代码工作,则必须删除 Executor 并清楚地运行两个流。

石油百科

赞同来自:

您的错误是您正在尝试执行
Thread


ThreadPool

.

这是

显然

, 有效,因为
Thread

实施
Runnable

, 但由于流只使用了
Runnable

并没有开始
Thread

, 呼叫方法喜欢
#interrupt//

, 不会有所需的效果。

如果您仍然需要使用流池,则应改为要研究类类的使用
FutureTask

. 包装你自己的
Runnable


FutureTask

, 然后将任务发送到流池。 然后,当您想中断任务时,请致电
futureTask.cancel/true/

.

诸葛浮云

赞同来自:

问题是您永远无法确切地知道将使用的流程。
Executor

履行任务。

即使你发了一个对象
Thread

, 执行者将使用由固定的流池创建的流。 因此,流程参考
t1

它不是您的任务将执行的流。 所以打电话
t1.interrupt//

什么都不会给予。

要正确执行此操作,您需要使用
ExecutorService

和使用
submit//

发送一个对象
Runnable

/
Callable

. 这将返回
Future

, 提供方法
cancel//

, 可用于取消任务。

石油百科

赞同来自:

打断艺术家的流 ,


final ExecutorService exec1 = Executors.newFixedThreadPool/1/;
final Future f = exec1.submit/runnable/;
...
f.cancel/true/;

八刀丁二

赞同来自:

称呼 Thread.interrupt 不一定导致 InterruptedException. 它可以简单地建立可以采访的中断的流状态。 Thread.interrupted// 或者 Thread.isInterrupted.


http://download.oracle.com/jav ... rrupt
// 更多细节。

要回复问题请先登录注册