也许,这是一个重复的问题, Thread.isInterrupted不起作用,Thread.interrupted做 。 但是因为我用一个完全不同的方式来调用Thread.isInterrupted()并升级到一个更新的jdk,我只是觉得这可能会导致另一种问题。
在我的程序中有三个线程(不包括主线程)。
sleep线睡10秒;
checker线程检查是否另一个线程中断了sleep ;
只要启动, interrupter中断sleep线程。
这是我的程序:
package foobar; public class Foobar { public static void main(String[] args) throws Exception { Thread sleep = new Thread(new Sleep()); sleep.start(); Thread checker = new Thread(new InterruptedChecker(sleep)); checker.start(); Thread interrupter = new Thread(new Interrupter(sleep)); interrupter.start(); } } class InterruptedChecker implements Runnable { private final Thread thread; InterruptedChecker(Thread thread) { this.thread = thread; } @Override public void run() { while (true) { if (thread.isInterrupted()) { break; } } System.out.println("The thread is interrupted."); } } class Sleep implements Runnable { @Override public void run() { try { Thread.sleep(10 * 1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } class Interrupter implements Runnable { private final Thread thread; Interrupter(Thread thread) { this.thread = thread; } @Override public void run() { System.out.println("interrupting..."); thread.interrupt(); } }
有趣的是有些东西(相当多)程序一直运行,并不打印"The thread is interrupted."的消息"The thread is interrupted." 这意味着sleep.isInterrupted()返回false ,但它有一些东西 。
从Java更新Windows上的文件时间戳
由org.gdal.ogr.ogrJNI.GetDriverCount()引起的UnsatisfiedLinkError
如何获得perf来解码hadoop java代码的符号
如何让2个Java应用程序相互交谈?
Android:ANT构build失败与谷歌播放服务的lib:“解决一个没有项目project.properties文件的path”
这是我的电脑(Ubuntu 13.10 64位)的java -version :
java version "1.7.0_45" Java(TM) SE Runtime Environment (build 1.7.0_45-b18) Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08,mixed mode)
当我读取Thread.isInterrupted不起作用,Thread.interrupted做以上,我试图编译我的代码在不同的机器上使用旧的jdk,它的工作。
而且,这里是机器的java -version (红帽企业Linux AS版本4(Nahant Update 3)64位):
java version "1.6.0_06" Java(TM) SE Runtime Environment (build 1.6.0_06-b02) Java HotSpot(TM) 64-Bit Server VM (build 10.0-b22,mixed mode)
所以我的问题是:
我的程序有问题吗?
如果没有,多核cpu或64位系统是否与这个问题有关?
编辑
感谢Peter的评论。
你想解决什么问题?
我刚刚读过这篇文章,就像我在评论中所说的那样,在“不要吞咽打断”一章中,
所以我不确定在checker中的checker线程是什么,在这里叫什么, 代码更高 。 我只是试图certificate这个post是正确的。 但似乎有什么不对劲。
进程内存vs堆 – JVM
Server 2008 r2环境中的Java Stringindexoutofboundsexception
AudioSystem.getmixerInfo()在Java / gentoo中没有任何内容
使用Apache POI和Spring框架将Excelfile upload到数据库
中断标志一旦被触发就会被重置。 即一旦sleep()被中断,标志被重置为false。
编辑
所以我不确定在程序中的checker线程是什么,在这里叫什么,代码更高。 我只是试图证明这个帖子是正确的。 但似乎有什么不对劲。
恕我直言,没有什么比另一个线程更高。 你通常想到的是这样的。
public static void main(String... ignored) throws InterruptedException,ExecutionException { ExecutorService es = Executors.newSingleThreadExecutor(); Future<?> future = es.submit(new Runnable() { @Override public void run() { methodA(); } }); Thread.sleep(1000); future.cancel(true); // interrupts task. long start = System.nanoTime(); try { future.get(); } catch (CancellationException expected) { // ignored } es.shutdown(); es.awaitTermination(1,TimeUnit.MINUTES); long time = System.nanoTime() - start; System.out.printf("Time to cancel/shutdown was %.1f milli-seconds%n",time / 1e6); } private static void methodA() { // doesn't throw any checked exception for (int i = 0; i < 100; i++) methodB(); } private static void methodB() { boolean conditionWhichIsTrue = true; if (conditionWhichIsTrue) try { Thread.sleep(500); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); } }
版画
Time to cancel/shutdown was 1.7 milli-seconds
但是,如果通过注释掉Thread.currentThread().interrupt(); 线需要约50秒停止,因为你只打断了一个电话睡觉。
这个问题也困扰了我一段时间。 经过一番调查,我得到了答案。
当InterruptedChecker检查isInterrupted状态时, Sleep线程已经死亡。 尝试在Thread.currentThread().interrupt();之后添加一些耗时的代码Thread.currentThread().interrupt(); 在Sleep类,再试一次。
当线程死亡时,线程的“中断”状态被清除。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。