Java运行和停止线程
假设我有:Java运行和停止线程,java,multithreading,Java,Multithreading,假设我有: class WriteThread extends Thread { char letter; boolean stop = false; WriteThread(char letter) { this.letter = letter; } public void halt() { stop = true; } public void run() { while(!stop) { System.out.
class WriteThread extends Thread {
char letter;
boolean stop = false;
WriteThread(char letter) {
this.letter = letter;
}
public void halt() { stop = true; }
public void run() {
while(!stop) { System.out.print(letter); }
}
}
以及:
执行(*)时是否保证两个线程都停止?(我所说的停止是指(*)之后不再有打印。您需要使“停止”变量不稳定。线程在看到vale为true时将停止循环,但可能存在输出缓冲,这会混淆问题。除了使“stop”变量不稳定外,为了使代码更“线程安全”,您应该为“stop”添加同步的get/set方法并使用它们(“while循环中的get”和“halt”方法中的“set”) 尽管如此,您仍无法保证线程在“暂停”后停止,但您可能会看到较少的“打印”
要获得这样的保证,您必须使用某种“线程同步”机制,例如,以某种方式,调用“a.halt()”的线程向“a”线程发出信号,以停止“while”循环并停止(内部停止),直到“while”循环有效结束并“释放”信号量(因此调用线程继续执行)当然不是。它与volatile与否无关,它只是多线程的本质 在调用a.halt()之后,线程a可能没有机会继续执行,而主线程执行b.halt()。之后,线程a可能仍然在println语句之前 仅一个简化版本将演示:
MAIN THREAD THREAD A
while (!stop)
a.halt()
println(...)
调用a.halt()
后,a
仍有机会继续打印,即使stop
变量不稳定
为了确保某个点之后线程完成,请使用join():
因为有多个线程,所以没有“after”。您还应该将stop声明为volatile“在()”之后将不再打印*,是的,可能。@为什么可能?因为停止不是易变的吗?@Shmoopy这将是我首先关心的问题,是的。我认为这里最重要的问题不是“停止”是否易变。即使
stop
是易变的,即使stdout中没有缓冲,在最后一次停止后仍然可以看到输出。请看我的答案。
MAIN THREAD THREAD A
while (!stop)
a.halt()
println(...)
WriteThread a = new WriteThread('a');
WriteThread b = new WriteThread('b');
a.start();
b.start();
// do some other stuff
a.halt();
b.halt();
a.join();
b.join();
// a and b are guaranteed to have finished at this point