- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这对您来说可能是一个非常简单的问题,但如果您能帮助消除我对此的疑问,我将不胜感激。
假设我创建了一个使用 sleep()
方法的线程,并且从我的 main 方法中中断了它。
这是我的代码片段
class myThread implements Runnable{
volatile boolean checking=true;
int counter =1;
public void run()
{
while(checking)
{
System.out.println(Thread.currentThread().getName() + " - count - "+counter++);
try{
Thread.sleep(1000);
}catch(InterruptedException e){
System.out.println("Interrupted");
Thread.currentThread().interrupt();
return; //line of confusion
}
}
}
public void stopCounting()
{
checking = false;
}
public boolean getCheker()
{
return checking ;
}
}
//main class
public class Demo{
public static void main(string args[])
{
myThread th = new myThread();
Thread t1 = new Thread(th);
t1.start();
for(int i=0;i<50000;i++)
{
//do nothing
System.out.println("Do nothing...");
}
t1.interrupt();
System.out.println("Press enter to stop the counter....");
Scanner sc = new Scanner(System.in);
sc.nextLine();
th.stopCounting();
//this line is executed when I am not using return statement
// in thread
System.out.println("value of while loop cheker is: "+th.getCounter());
}
}
上面的例子中的“return”返回到哪里呢?
情况 1: 我检查了 catch block 中是否保留了“return”关键字,最后执行的行再次来自主方法,即“Press Enter to stop the counter... ”
情况 2: 如果我省略 return 语句,则 main 中最后执行的行是 "System.out.println("value of counter is "+th.getCheker());"
我的问题是,为什么在第一种情况下也行“System.out.println(“计数器的值是”+th.getCheker());”没有执行?
我认为,当调用 return 时,控件应该从线程的“run()”方法返回到 main 中线程启动的位置。因此,当时尚未在 main 中执行的语句现在应该执行。但似乎如果我使用 return 语句,应用程序就会结束。主力也回归了。此后没有任何语句被执行。您能解释一下吗?我缺少什么?
最佳答案
您的“困惑线”将导致线程的 run()
方法返回。这将导致线程死亡,因为当 run()
返回时,线程总是死亡。
“情况 1:”与“情况 2:”
您的“困惑线”包含在一个循环中。如果您取出 return
语句,则 run()
方法此时不会返回:它将返回到 while(检查)
循环。
I thought while return is called the control should return from the "run()" method of the thread to the place in main from where the thread is started.
线程不是这样工作的。新线程没有什么可返回的。 main() 线程的工作是执行启动新线程之后的语句。当新线程的 run()
方法完成时,除了死亡之外,它没有什么可做的。
关于java - 如果在线程中 InterruptedException 的 catch block 内使用 "return",它会在哪里返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42860706/
场景如下。 我实现了一个这样的界面: public interface MessageSourceProvider { MessageSource getMessageSource(Local
这个问题已经有答案了: I want my thread to handle interruption, but I can't catch InterruptedException because
这段代码应该可以编译,不是吗?我究竟做错了什么?我希望代码在显示数组中的每个数字之前短暂暂停。 public static void median(int odd[]) throws Interrup
我正在学习 Java 并发,并尝试了 Java 教程中的示例,并进行了一些实验( try catch 异常)。 public class SleepMessages { public stat
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Handling InterruptedException in Java 我想知道如何InterruptedExc
这个问题已经有答案了: Handling InterruptedException in Java (7 个回答) 已关闭 6 年前。 我有课 class Foo { static void
我有两个同步适配器,我希望每个同步适配器都等到另一个同步适配器完成后再开始执行。我对信号量使用了以下技术: public class SyncerOne extends AbstractThreade
Given code is working in doInBackground(). Where while loop is always true but i don't know how it c
我有一个以 LinkedBlockingQueue 作为属性的类 A。在 A 的一种方法中,我调用了 LinkedBlockingQueue.put() 方法,因为我想在队列中插入一个项目。但是,如果
我对 Java SE 6 中 Condition 类的 await 方法有一个奇怪的问题。问题是 await 方法在被另一个线程中断时并不总是抛出异常。 在文档中写到在以下情况下会抛出 IE: ...
我很困惑,无法理解为什么不应该吞下 InterruptedException。 IBM 的文章说 当阻塞方法检测到中断并抛出 InterruptedException 时,它会清除中断状态。如果您捕捉
我正在阅读 kathy sierra SCJP 1.5 第 9 章(线程),其中提到: Notice that the sleep() method can throw a checked Inter
我一直在同步块(synchronized block)内收到此异常,在同步块(synchronized block)中我对同步的同一个对象调用等待。一个线程首先被中断是什么意思?其次,发生这种情况的正
对于任何 Java 大师来说,这应该是一个简单的练习。我是新手,只是想确认一件事。 我有一个实现 Runnable 的类,与许多此类类一样,它的 run() 方法有一个无限循环。我想做一些任务,然后睡
我有以下方法,效果很好。我正在尝试测试抛出 InterruptedException 的场景。这就是我目前正在测试的方式,如果我只运行这个单一测试,它会起作用。但是如果我要在我的测试类中运行所有剩余的
我偶然发现了一种情况,我必须处理 InterruptedException,但无法将其向上传递并且不认为我的代码应该被允许吞下它。准确地说,我正在研究分布式锁实现,并且对支持服务的请求可能会中断甚至超
我正在尝试编写一个程序,其中每个类都有单独的类和方法,交叉调用其他类的方法。下面是我想从另一个类的另一个方法调用的编码方法。 public class walk{ public void wa
我有一个 vaadin 应用程序,它使用 hibernate 并在 glassfish 中上传,我们收到此错误: AdmissionWeb:2018-07-03 12:01:06 [WARN ][ht
我有代码,需要等待一段时间作为繁忙等待的一部分(由于遗留代码,我无法更改那么多)。我已经阅读了为什么我应该在此处执行此操作的推理 [1] 和 [2],并且它是显而易见的经验法则。经常这样做。 IIUC
我有这段代码。如果在等待添加到队列时被中断,LinkedBlockingQueue 应该仅抛出 Exception。但这个队列是无限的,所以它应该尽快添加。为什么我的关闭方法会抛出 Interrupt
我是一名优秀的程序员,十分优秀!