正在停止可运行的对象,等效于停止线程



给定此代码:

public class Game implements Runnable {
  private volatile boolean stop;
  public Game() {
    ...
  }
  public void run() {
    while(!stop) {
      // play game
    }
  }
  public void stopGame() {
    stop = true;
  }
}
public class Main {
  public static void main(String[] args){
    Game g = new Game(); // Game class implements Runnable
    Thread t = new Thread(g);
    t.start();
    // do the two method calls below effectively do the same thing?
    t.interrupt();
    g.stopGame(); 
  }
}

stopgame((是否有效地杀死线程,就像使用中断或java.lang.thread方法杀死线程一样?(我不太熟悉如何使用线程方法杀死线程。(

另外,如果stopgame((是杀死线程的最佳方法,如果他们只能访问类似下面的线程实例,就可以调用它:

public static void Main(String[] args){
  List<Thread> threads = new ArrayList<Thread>();
  threads.add(new Thread(new Game()));
  // can you access the Game instance given the Thread instance 
  // or do you need to hold onto the reference of the Game instance?
  threads.get(0).stopGame(); // for example, this won't work.
}

stopgame((是否会像使用中断或java.lang.thread方法杀死线程一样有效地停止线程?(我不太熟悉如何使用线程方法杀死线程。(

停止线程的最佳方法是从运行((方法返回。

您的stopgame((调用在下一个通过循环中引起了这一点。但是,如果该循环包含阻塞呼叫,则下一个通行证可能会在延迟之后发生 -

杀死线程的方法是因为它们天生不安全。

Thread.interrupt()不能保证停止任意线程。它唤醒了一些阻止电话。在捕捉中断的exception时,可以停止可运行的人是普遍的,但不是普遍的。从中断的Java教程:

中断是线程的指示,表明它应该停止在做什么并做其他事情。由程序员确切决定线程如何响应中断,但线程终止非常常见。

一种方法是设置用户定义的标志并呼叫thread.inter.interrupt((。这将中断任何阻止呼叫,即使可运行的代码捕获了InterruptedException或清除了中断状态标志。

另外,如果stopgame((是杀死线程的最佳方法,如果他们只能访问类似下面的线程实例,就可以调用它:

您可以子类线程持有游戏,并在子类中提供方法以停止游戏。但是,通常只需单独跟踪可运行的实例就更容易。

"杀死"线程是一个异常情况。

interrupt()方法可以完成这项工作,但是在这种情况下,您不需要在运行((方法的while条件下使用布尔标志。
这个:

  public void run() {
    while(!stop) {
      // play game
    }
  }

可能是:

  public void run() {            
      while (!Thread.currentThread().isInterrupted()) {
         // play game
      }                
  }

但就我个人而言,由于中断线程的任何阻止调用都会被唤醒。
您可能会被迫处理此过早出口,该出口可能会在 portral 退出案例中造成不一致的情况。
使用boolean标志使线程代码负责执行该作业,因为它认为应该不强迫其阻止调用。

这并不意味着InterruptedException绝不应该处理,但我认为对于正常情况(从用户请求退出(,使代码更加复杂,因为需要它。

确实stopgame((杀死线程和使用类似的东西一样有效 中断或java.lang.thread方法杀死线程?

结束线程的合适方法是允许其终止其执行:那就是该方法的run()完成其执行。

在此处使用boolean的CC_7条件很好:

public void run() {
    while(!stop) {
      // play game
    }
  }

同样,如果stopgame((是杀死线程的最佳方法,则 如果他们只能访问线程实例,则有任何调用 如下:

您可以这样做:

  Game game = new Game(); 
  game.start();
  ...
  game.stopGame();

最新更新