gpt4 book ai didi

java - 停止线程的单个实例

转载 作者:行者123 更新时间:2023-12-01 12:57:25 25 4
gpt4 key购买 nike

我有两个连续运行的线程实例。我怎样才能停止线程的第一个实例。请找到下面的代码:-

public class Thread1 extends Thread {

static volatile boolean bThreadStop = false ;

public void run() {
while(!bThreadStop) {
System.out.println("THREAD1");
//BUSINESS LOGIC//

}
}
public static void main(String[] args) {
Thread1 t1 = new Thread1();
t1.start();

Thread1 t2 = new Thread1();
t2.start();

}
}

根据上面的示例,我需要停止 Thread1 的 t1 实例。请建议我如何实现同样的目标。

最佳答案

您的问题的直接答案是您的标志是静态的,因此 Thread 子类的所有实例都会看到相同的标志;使其成为实例范围而不是静态将意味着可以单独停止各个线程对象。另外,使标志成为 volatile 意味着标志的更新对于 Thread 子类实例来说是可见的。如果没有 volatile ,标志检查可以被 JVM 优化掉。

但是使用您自己的标志来取消线程并不是一个好主意。已经为您制作了一个非常好的标志,并将其烘焙到 Thread 类中。事实上,它比您能想到的任何东西都要好,因为您的线程无法停止 hibernate 或等待检查自己的标志,因此一旦设置它,线程可能需要一段时间才能响应。但是,如果您使用中断设施,那么线程可以检查自己的中断标志并立即停止 sleep 或等待。

这是您的示例,经过修改以使用中断。在您的示例中,输出不区分 Thread1 和 Thread2,我添加了一个名称来帮助解决这个问题。此外,我还向线程添加了 sleep (为了减少写入控制台的内容量以及演示中断 sleep 线程),并让示例在等待足够长的时间后取消第二个线程明确哪个线程首先被取消。

public class Thread1 extends Thread {

public Thread1(String name) {
super(name);
}

public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
System.out.println(getName());
//BUSINESS LOGIC//
Thread.sleep(1000L);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("thread " + getName() + " woke up");
}
System.out.println("thread " + getName() + " finished");
}

public static void main(String[] args) throws Exception {
Thread1 t1 = new Thread1("t1");
t1.start();
Thread1 t2 = new Thread1("t2");
t2.start();
Thread.sleep(5000L);
t1.interrupt(); // cancel the first thread
Thread.sleep(5000L);
t2.interrupt(); // cancel the second thread
}
}

输出如下:

t1
t2
t1
t2
t2
t1
t2
t1
t2
t1
thread t1 woke up
thread t1 finished
t2
t2
t2
t2
t2
thread t2 woke up
thread t2 finished

我有另一个线程中断的示例,其中包含更多详细信息 here .

关于java - 停止线程的单个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23767679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com