• 线程状态及线程停止


    线程状态

    • 创建状态:线程对象一旦创建就进入创建状态
    • 就绪状态:当调用start()方法,线程立即进入就绪状态,但不意味着立即调度执行
    • 阻塞状态:当调用sleep,wait或同步锁定时,线程进入阻塞状态,就是代码不往下执行,阻塞事件解除后,重新进入就绪状态,等待CPU调度执行
    • 运行状态:进入运行状态时,线程才真正执行线程体的代码块
    • 死亡状态:线程中断或者结束,一旦进入死亡状态,就不能再次启动

    线程方法

    方法说明
    setPriority(int newPriority)设定线程的优先级
    static void sleep(long millis)在指定的毫秒数内让当前正在执行的线程休眠
    void join()线程插队,强行排到当前执行的线程前面执行
    static void yield()让当前正在执行的线程回来重新竞争,CPU重新选一个线程执行
    void interrupt()中断线程,一般不用这个方式
    boolean isAlive测试线程是否处于活动状态

    线程停止

    • 不推荐使用JDK提供的stop()、destroy()方法。(基本已经废弃)
    • 推荐让线程自己停下来
    • 建议使用一个标志位进行终止变量 当flag=false,则终止线程运行

    示例代码如下

    package com.thread;
    
    public class TestStop implements Runnable{
    
        //1,设置一个标志位
        private boolean flag=true;
    
        @Override
        public void run() {
            int i=0;
            while(flag){
                System.out.println("run----thread"+i++);
            }
        }
    
        //2,设置一个公开的方法停止线程,转换标志位
        public void stop(){
            this.flag=false;
        }
        public void start(){
            this.flag=true;
        }
    
        public static void main(String[] args) {
            TestStop testStop = new TestStop();
            new Thread(testStop).start();
    
            for(int i = 0;i<15000;i++){
    
                System.out.println("main"+i);
                if(i==5000){
                    //调用stop方法切换标志位,让线程停止
                    testStop.stop();
                    System.out.println("线程该停止了");
                    testStop.start();  //如果在同一个if语句中将标志符转换回来,可以继续使用线程
                    System.out.println("线程开始了");
    
                }
    /*            if(i==7500){
                    //在这里的不能重新开启线程
                       estStop.start();
                    System.out.println("线程开始了");
    
                }*/
    /*            if(i==14000){
                    //意思是当主线程执行循环到14000次时,停止线程
                    testStop.stop();
                    System.out.println("线程该停止了");
                }*/
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    发现问题

    • 在同一个if语句后重新改变标志位可以继续运行,但在这个if语句之后再改变则无效
    • 多线程如何debug
  • 相关阅读:
    为什么nginx用户使用的nginx不能监听80端口?
    通俗易懂,一文学会前端缓存
    U盘分配单元大小建议设置多少?
    LeetCode之二叉树
    ARM架构与调测调优实战
    ElasticSearch (一)ElasticSearch 入门简介
    基于Matlab利用IRM和RRTstar实现无人机路径规划(附上源码+数据+说明+报告+PPT)
    Vue3 Vite Setup语法糖插件的配置
    树上查询SPOJQTREE4
    基于springboot+vue的公司员工工资资产管理系统 elementui
  • 原文地址:https://blog.csdn.net/diyinhuanqian/article/details/125630900