- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我对下面程序中 thread.isInterrupted
的行为有点困惑。
public class ThreadPractice {
public static void main(String args[]) throws InterruptedException {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("Starting thread..." + Thread.currentThread().getName());
Thread.sleep(10000);
System.out.println("Waking up");
}catch(InterruptedException e){
System.out.println("Thread is interrupted!!!");
Thread.currentThread().interrupt();
}
}
});
t.start();
Thread.sleep(2000);
t.interrupt();
//System.out.println(!t.isInterrupted());
while(!t.isInterrupted()){
System.out.println("Current thread not interrupted!!!");
}
}
}
当执行上面的程序时,它打印,
Starting thread...Thread-0
Thread is interrupted!!!
但是当我取消注释 System.out
语句以打印中断状态时,它会进入无限循环打印“当前线程未中断”
我无法弄清楚 System.out
语句到底有什么不同。
最佳答案
请注意,我并不总是遇到无限循环。
我怀疑这是由于操作交错造成的。它还有助于检查线程是否存活:
System.out.println("Current thread not interrupted!!! Alive? " + t.isAlive());
如果线程不活动,则其中断状态为 false。
我得到如下输出:
Starting thread...Thread-0
Thread is interrupted!!!
Current thread not interrupted!!! Alive? true
Current thread not interrupted!!! Alive? false
[infinite loop]
我猜第一个循环看到线程没有被中断,因为 InterruptedException
已经删除了标志 - 然后你在 run 中用
方法和线程可以完成并且不再存在。interrupt()
重置标志()
下一个循环检查发现它不存在,于是你开始了一个无限循环。
一个有趣的变化可以通过添加:
System.out.println("Exiting Thread!!!");
在 run()
方法的末尾 - 它提供了足够长的延迟,以便在重置中断标志和线程结束之间检查循环条件。
关于java - 调用 thread.isInterrupted 并打印结果时的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27490381/
我对 Thread 子类取消政策的实现有疑问。这样做似乎是常见的做法: class A extends Thread { [...] public final void run() {
我研究java线程,一时看不懂:在下面的代码中 public class ThreadsTest { public static void main(String[] args) throws
用interrupt()做实验,发现isInterrupted()总是false。 另一件事是用 Thread.interrupted() 替换 isInterrupted() 会使线程停止。 有人可
一,介绍 本文记录JAVA多线程中的中断机制的一些知识点。主要是stop方法、interrupted()与isInterrupted()方法的区别,并从源代码的实现上进行简单分析。 JAVA中有
我正在玩线程,并从我的程序中发现了一些我无法理解的奇怪输出。 这是我的 Self 类: public class Self { public static void main(String[]
我找到了JavaDoc的方法: 返回:true 如果该线程已被中断;否则为 false。 我觉得我对这个方法的理解有问题。此外,我可能误解了Thread中“中断”的概念。 欢迎任何解释!谢谢! 代码片
假设我有以下代码: while(!Thread.currentThread().isInterrupted()){ //do something Thread.sleep(500
我正在浏览 Javadoc for interrupts .我确实了解 Thread 类的两种方法之间的区别:interrupted() 和 isInterrupted()。引用文档: When a
我找到了JavaDoc的方法: 返回:如果此线程已被中断,则为 true;否则为假。 我认为我对方法的理解有问题。此外,我可能会误解 Thread 中的“中断”概念。 欢迎任何解释!谢谢! 代码片段:
这个问题已经有答案了: Why does Thread.isInterrupted () always return false? (4 个回答) 已关闭 5 年前。 我遇到了奇怪的行为。所有消息来源
我想知道是否有人可以消除我对我遇到的实现问题的困惑;如果 Thread.interrupted() 清除当前线程的标志,并告诉您当前线程是否被中断,我缺乏理解的是静态范围。静态函数如何知道我当前的线程
也许,这是Thread.isInterrupted doesn't work, Thread.interrupted does的重复问题.但是由于我使用了一种完全不同的方式来调用 Thread.isI
从 java 源代码来看,它看起来像是放入 native 代码。成本大致相当于 volatile 读取还是需要获取某种类型的锁? 最佳答案 Thread.isInterrupted() 是一个调用成本
考虑以下 JUnit 测试: @Test public void testSettingInterruptFlag() throws InterruptedException { Thread
我对下面程序中 thread.isInterrupted 的行为有点困惑。 public class ThreadPractice { public static void main(Stri
我有一个线程调用work()方法,这是一个简单的while(true)-loop,如下所示; public void work() throws InterruptedException {
当我修改一些旧代码时,我遇到了。 public void stop() { if (this.simulationThread != null) { this.simulati
下面的程序演示了这个问题(最新的 JVM 等等): public static void main(String[] args) throws InterruptedException { /
Java问题:据我所知,线程内部检查线程是否收到中断信号有两种方法,Thread.interrupted()和Thread.isInterrupted() ,它们唯一的区别是前者重置了内部中断标志
在我们的应用程序中,我们有线程执行特定操作。收到事件后,我们需要中断那些正在进行的线程。这些线程将通过调用“Thread.currentThread().isInterrupted()”来检查其中断状
我是一名优秀的程序员,十分优秀!