如何在Java中停止线程?

停止线程

  • 众所周知,在Java中没有直接或快捷方式来停止线程。

  • 众所周知,java中的线程会在run()方法执行正常完成时停止,或者线程在线程完成同时引发异常时停止。

  • 在Java JDK的早期版本中,存在一个名为“ stop”的Thread类方法,但是在更高版本中不推荐使用此方法,因此在Java的更高版本中不支持该方法。

  • Java没有提供一些直接的方法来停止Java中的线程,但是在Java JDK早期版本中定义了一些控制方法,下面给出了该方法的名称:

    1. stop()

    2. suspend()

    3. resume()

  • 上面给出的所有方法均已弃用,因此在更高版本的Java中不支持。

  • 我们将看到如何隐式停止线程Java JDK仅在以下情况下隐式停止线程:一个线程run()方法正常完成了该线程的执行,或者同时一个线程引发了异常。

  • 现在,我们将看到如何手动停止线程:我们可以通过两种方式手动停止线程:

    1. 借助volatile布尔变量

    2. 借助interrupt()方法

现在,我们将在下面逐一详细说明...

借助volatile布尔变量

  • 第一步,我们将在线程中声明一个易失的布尔变量。

  • 首先,在第二步中,我们将volatile布尔变量的值分配为true。

  • 在第三步中,我们将在while循环中定义作业,并在while循环中传递易失布尔变量的参数,并将循环保留在run()方法内部。通过使用循环,线程将继续运行,直到volatile布尔变量变为false。

  • 在第四步中,我们将在线程内定义另一个名为“ stopThread()”的方法,在此方法中,我们将volatile布尔变量设置为false以停止线程。

  • 在第五步或最后一步,我们不需要手动执行任何操作即可停止线程。要停止线程,我们可以简单地调用用户定义的stopThread()方法来停止线程。

示例

//停止线程 
//易失的布尔变量

class ChildThread extends Thread {
    //最初为布尔变量赋值为true-
    volatile boolean thread_stop = true;

    //该方法定义为停止线程
    public void stopThread() {
        thread_stop = false;
    }

    //这个循环将继续直到布尔变量变为false-
    public void run() {
        while (thread_stop) {
            System.out.println("Child Thread Started");
        }
        System.out.println("Child Thread Ended");
    }
}

class Main {
    public static void main(String[] args) {
        ChildThread ct = new ChildThread();
        ct.start();
        try {
            Thread.sleep(100);
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }

        //将调用此方法以停止线程
        ct.stopThread();
    }
}

输出结果

Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
.
.
.
.
.
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Ended

借助interrupt()方法

我们将使用现成的interrupt()方法来停止线程。

当我们在线程对象上调用中断方法时,它将分配线程的中断状态,并且该状态可以由该interrupted()方法生成。

示例

//来停止线程

class ChildThread extends Thread {
    //这个循环将继续直到布尔变量变为false-
    public void run() {
        while (!Thread.interrupted()) {
            System.out.println("Child Thread Started");
        }
        System.out.println("Child Thread Ended");
    }
}

class Main {
    public static void main(String[] args) {
        ChildThread ct = new ChildThread();
        ct.start();
        try {
            Thread.sleep(100);
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }

        //将调用此方法来中断线程
        ct.interrupt();
    }
}

输出结果

Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
.
.
.
.
.
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Started
Child Thread Ended