holistic杀手 发表于 2023-8-28 09:50:49

return相关的基础问题

public class ThreadTest09 {
    public static void main(String[] args){
      MyRunnable6 r = new MyRunnable6();
      Thread t = new Thread(r);
      t.setName("分支线程t");
      t.start();

      //5秒后想让它中断
      try {
            Thread.sleep(1000*5);
      } catch (InterruptedException e) {
            e.printStackTrace();
      }
      r.run = false;

    }

}

class MyRunnable6 implements Runnable{

    boolean run = true;

    /*第一种
   @Override
    public void run() {
      if (run){
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName()+"---->"+i);
                try {
                  Thread.sleep(1000);
                } catch (InterruptedException e) {
                  e.printStackTrace();
                }
            }
      }else {
            return;
      }
    }*/

    @Override
    public void run() {
      for (int i = 0; i < 10; i++) {
            if (run){
                System.out.println(Thread.currentThread().getName()+"---->"+i);
                try {
                  Thread.sleep(1000);
                } catch (InterruptedException e) {
                  e.printStackTrace();
                }
            }else {
                return;
            }
      }
    }
}

为什么不能用第一种中断线程的执行{:10_330:}

isdkz 发表于 2023-8-28 09:51:18

第一种中断线程的执行的代码是被注释掉的,因此无法执行。在注释中,返回语句被用于中断线程的执行。当run变量为false时,返回语句会提前结束run方法的执行,从而中断线程。但是,在第一种方式中,即使run变量为false,线程仍然会继续执行for循环中的代码,这是因为return语句只会中断当前的run方法,而不会中断整个线程的执行。

在第二种方式中,当run变量为false时,使用return语句中断了整个run方法的执行,从而中断了线程的执行。因此,第二种方式是正确的中断线程的方式。

陶远航 发表于 2023-8-28 09:51:48

第一种中断线程的执行的方法是通过在run()方法中使用return语句来提前结束线程。但是,这种方式并不会真正中断线程的执行,而只是提前将run()方法返回,正常执行后续代码。

在你提供的代码中,使用第一种方式时,当run为false时,线程的执行会跳出循环并执行return语句,但是线程并没有被真正中断,仍会继续执行其余的代码,直至run()方法结束。

要实现真正的线程中断,可以使用Thread.interrupt()方法来中断线程。调用该方法会设置线程的中断标志位,然后需要在线程的执行逻辑中判断中断标志位,并根据需要做出相应的处理。

以下是修改后的代码示例,使用Thread.interrupt()方法来中断线程的执行:

public class ThreadTest09 {
    public static void main(String[] args) {
      MyRunnable6 r = new MyRunnable6();
      Thread t = new Thread(r);
      t.setName("分支线程t");
      t.start();

      // 5秒后想让它中断
      try {
            Thread.sleep(1000 * 5);
      } catch (InterruptedException e) {
            e.printStackTrace();
      }
      
      t.interrupt(); // 中断线程
      r.run = false;
    }
}

class MyRunnable6 implements Runnable {
    boolean run = true;

    @Override
    public void run() {
      for (int i = 0; i < 10; i++) {
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("线程已被中断");
                return; // 根据需要进行处理,可以提前结束线程
            }

            if (run) {
                System.out.println(Thread.currentThread().getName() + " ----> " + i);
                try {
                  Thread.sleep(1000);
                } catch (InterruptedException e) {
                  System.out.println("线程被中断");
                  return; // 根据需要进行处理,可以提前结束线程
                }
            } else {
                return; // 根据需要进行处理,可以提前结束线程
            }
      }
    }
}


通过以上修改,当调用t.interrupt()方法时,线程将通过判断中断标志位来提前结束执行。

请注意,在run()方法中使用Thread.currentThread().isInterrupted()方法来判断线程的中断状态,并根据需要进行相应的处理。同时,在捕获InterruptedException异常时,也可以通过return语句提前结束线程的执行。

希望能帮助到你!如果你还有任何问题,请随时提问。
如果问题已经解决,请设置最佳答案

holistic杀手 发表于 2023-8-28 18:48:06

{:10_330:}
页: [1]
查看完整版本: return相关的基础问题