给定此代码:
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();