Java 如果在线程中InterruptedException的catch块内使用,“return”在哪里返回?

Java 如果在线程中InterruptedException的catch块内使用,“return”在哪里返回?,java,multithreading,Java,Multithreading,这对你们来说可能是一个非常简单的问题,但若你们能帮我澄清我对此的疑问,我将不胜感激 假设我创建了一个使用sleep方法的线程,并且从我的main方法中断了它 这是我的代码片段 class myThread implements Runnable{ volatile boolean checking=true; int counter =1; public void run() { while(checking) {

这对你们来说可能是一个非常简单的问题,但若你们能帮我澄清我对此的疑问,我将不胜感激

假设我创建了一个使用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());
    }
}
在上述情况下,返回到哪里

案例1:我检查了是否将return关键字保留在catch块中,最后执行的行再次来自main方法,即按enter停止计数器

案例2:如果省略return语句,那么main中最后执行的行是System.out.printlnvalue,计数器的值是+th.getCheker

我的问题是,为什么在第一种情况下,计数器的line System.out.printlnvalue也是+th.getCheker;没有被执行吗


我认为在调用return时,控件应该从线程的run方法返回到main中线程启动的位置。所以,那个时并没有在main中执行的语句现在应该执行。但是,如果我使用return语句,应用程序就要结束了。主力也回来了。之后不会执行任何语句。你能解释一下吗?我缺少什么?

它将结束函数,当函数返回void时,它将不返回任何内容

返回;将打破while循环

你可以使用break;或者checking=false,你也会有同样的影响

最后执行的行来自主方法,即按enter键停止计数器

也许这是因为它正在等待你真正按下回车键

如果我省略了return语句,那么main中最后执行的行是System.out.printlnvalue,计数器的值是+th.getCheker

那行代码与你的问题不匹配

应该从线程的run方法返回到main中线程开始的位置

不,它是一个单独的线程,在后台并行执行。您只是碰巧打印到同一个输出流,所以很难看到

线程使用自己的调用堆栈在自己的线程中执行。当您从run返回时,它将结束,从而停止它,并且不会返回到代码中的其他地方


如果要卸下扫描仪,则应运行已打印的两条语句

您的混淆将导致线程的run方法返回。这将导致线程死亡,因为运行返回时线程总是死亡

案例1:与案例2:

您的混淆线包含在一个循环中。如果取出return语句,那么run方法将不会在该点返回:它将返回whilechecking循环的顶部

我认为在调用return时,控件应该从线程的run方法返回到main中线程启动的位置


线程不是这样工作的。新线程没有什么可返回的。主线程的任务是执行启动新线程后的语句。当新线程的run方法完成时,除了die之外,它没有什么可以做的。

这只意味着该方法将在那里中断,它不会返回任何内容,它将停止进一步运行。您能再解释一下吗?方法将在那里中断-你是指线程的run方法,对吗?在这种情况下,为什么主管道也会停止?根据我的理解,在本例中,return应该停止执行线程的run方法中的任何内容,但main方法是另一个线程。为什么这也会受到阻碍?t1.中断;停止线程。停止计数;不。。。无论线程操作是什么,System.out.println都应该执行谢谢你的回答。