Java 如何停止所有活动线程的运行

Java 如何停止所有活动线程的运行,java,multithreading,Java,Multithreading,因此,我正在研究多线程技术,并编写了一个非常基本的程序。这个想法很简单,我会启动两个线程,每个线程都会向下(递减)到零,在这一点上,一个线程将被宣布为赢家,其他线程将立即停止。我使用了一个布尔标志,它终止了其他线程,但有时它们会继续执行一段时间(我猜直到它们在while循环中检查run是否仍然为true) 我尝试过中断,但我的理解是,这些只在休眠、等待等线程上工作,而我使用的线程几乎一直在运行。我使用过system.exit(1),但这也不能阻止它们,至少不能立即停止。只是想知道更有经验的人会怎

因此,我正在研究多线程技术,并编写了一个非常基本的程序。这个想法很简单,我会启动两个线程,每个线程都会向下(递减)到零,在这一点上,一个线程将被宣布为赢家,其他线程将立即停止。我使用了一个布尔标志,它终止了其他线程,但有时它们会继续执行一段时间(我猜直到它们在while循环中检查run是否仍然为true)

我尝试过中断,但我的理解是,这些只在休眠、等待等线程上工作,而我使用的线程几乎一直在运行。我使用过system.exit(1),但这也不能阻止它们,至少不能立即停止。只是想知道更有经验的人会怎么做?基本上,我只想要一条线来说“好的,大家停止你们现在正在做的事情”

代码如下:

可运行类

public class ThreadRunnable implements Runnable {

    private static boolean run;
    private int tick;

    public ThreadRunnable() {
        run = true;
        tick = 5;
    }

    public void run() {
        Thread t = Thread.currentThread();
        while (run) {
            tickDeduction();
            if (tick == 0) {
                System.out.println("Thread " + (Thread.currentThread().getId()) + " WINS");
                this.run = false;
                return;
            }
        }
    }

    public synchronized void tickDeduction() {
        System.out.println("Thread " + (Thread.currentThread().getId()) + " is at tick " + this.tick);
        this.tick--;
    }
}
     public static void main(String[] args) {
        ThreadRunnable runnableBlue = new ThreadRunnable();
        ThreadRunnable runnableRed = new ThreadRunnable();
        Thread teamBlue = new Thread(runnableBlue); 
        Thread teamRed = new Thread(runnableRed);
        teamBlue.start();
        teamRed.start();
    }
主类

public class ThreadRunnable implements Runnable {

    private static boolean run;
    private int tick;

    public ThreadRunnable() {
        run = true;
        tick = 5;
    }

    public void run() {
        Thread t = Thread.currentThread();
        while (run) {
            tickDeduction();
            if (tick == 0) {
                System.out.println("Thread " + (Thread.currentThread().getId()) + " WINS");
                this.run = false;
                return;
            }
        }
    }

    public synchronized void tickDeduction() {
        System.out.println("Thread " + (Thread.currentThread().getId()) + " is at tick " + this.tick);
        this.tick--;
    }
}
     public static void main(String[] args) {
        ThreadRunnable runnableBlue = new ThreadRunnable();
        ThreadRunnable runnableRed = new ThreadRunnable();
        Thread teamBlue = new Thread(runnableBlue); 
        Thread teamRed = new Thread(runnableRed);
        teamBlue.start();
        teamRed.start();
    }
基本上,我只想要一条线来说“好的,大家停止你们现在正在做的事情”

Java应用程序没有办法对自己这样做。不过,调试器可能能够做到这一点。(当然,JDWP协议有一个冻结目标JVM中所有线程的命令…)



在Java应用程序中,最接近的方法是遍历线程组和线程树,并对每个线程应用不推荐的
Thread.suspend()
方法。(注意不要暂停当前线程…)但是suspend方法是危险的(请参阅javadocs),并且不能保证您将在遍历中看到所有线程。当然,这个(假设的)过程不是即时的。

使用一个只能声明一次且只能首次声明的标志。其中一个是带有
compareAndSet()
方法的
AtomicBoolean
。要停止其他线程,可以发送
中断()

(Java过去拥有停止和终止线程的能力,但这会导致问题。中断是使线程脱离正常执行的唯一可靠方法。)

import java.util.Random;
导入java.util.concurrent.AtomicBoolean;
公共班机{
公共静态void main(字符串[]args){
最终AtomicBoolean标志=新的AtomicBoolean(false);
最终螺纹[]流道=新螺纹[5];
最终随机数=新随机数();
对于(int i=0;i
如果将
运行
设置为
私有静态易失性布尔值
,会发生什么情况?另外,如果
run
static
,则不应执行
此操作。使用
ThreadRunnable.run
。静态不这样做吗?不<代码>静态
仅表示该成员是类级别的成员
volatile
做了一些不同的事情。问题是输出是同步的,因此线程可能会被阻塞,等待打印。所以可能是线程8正在等待线程9完成打印,然后才可以打印。然后它检查
run
,看到它是
false
,然后退出。所以你的猜测是对的。@Danrex你想得不对。不要想,“我怎样才能把手伸进线里,让它停下来”。想一想,“我如何编写线程,这样我就不需要深入到线程中去做或不做任何事情。”好吧,我可以接受,如果我做不到,那么我就做不到。好吧,从技术上讲,这是存在的。但是如果我没记错的话,这些方法在不久前就被弃用了,因为它们使用起来不安全。@user3580294-不,即使这样也不行。1) 一次只能停止/暂停一个线程。。。并不是像OP想要的那样一下子完成。2) 如果您停止/暂停了所有线程,执行该操作的线程也将停止/暂停,并且无法取消暂停。是的,我没有使用stop方法,因为它已被弃用。如果做不到,我可以接受。我只是想确保我没有丢失任何东西。