随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。

一、

对于多线程的启动一定是Thread类中的start()方法,而如果需要进行多线程的停止处理,Thread类原本提供了stop()方法,但是对于这个方法从JDK1.2开始就已经将其废除了,而除了stop()以外还有几个方法也被禁用了。

  - 停止多线程:  

  - 销毁多线程: 

  - 挂起线程(暂停执行): 

  - 恢复挂起的线程执行:

 

 

 之所以废除这些方法,是因为这些方法可能会导致死锁,所以从JDk1.2开始就都不建议使用了。

这个时候要想实现线程的停止就需要一种柔和的方式进行:

package Demo_2_1_线程的停止;

public class Main {
    public static boolean flag = true;
    public static void main(String[] args) {
        new Thread(()->{
            long num = 1;
            while (flag){
                try {
                    Thread.sleep(500);   // 休眠500毫秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "、正在运行 " + num ++);
            }
        },"执行线程").start();
        try {
            Thread.sleep(200);  // 运行200 毫秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 因为线程已经通过了while的判断但是会延迟500毫秒,但是这个时候主线程在延迟200毫秒后就将flag的值改为了false,所以当500毫秒后子线程在执行了一次输出操作后,再进入判断时就通不过了。
        /*
        就好比两个人同时在劳作:
            主线程控制水龙头(while)来控制水的开关,子线程进行浇水操作,
            我们都知道开一次水龙头才能浇一次水,关闭就无法继续浇水,
       当整个工作启动的时候,第一次水龙头是打开的,判断通过, 此时水已经到达了水管内,然后在200毫秒后主线程关闭了水龙头, 虽然子线程等待了500毫秒才进行浇水,但是因为通过了判断,水管中是存在水的, 所以此时子线程仍然可以浇一次水,但是浇完水后水龙头是关闭的状态, 所以子线程无法继续浇水,就结束了浇水行为。
*/ flag = false; // 停止线程 } }

 

posted on 2022-02-01 20:01  时间完全不够用啊  阅读(150)  评论(0)    收藏  举报