Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java运行和停止线程_Java_Multithreading - Fatal编程技术网

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