当前位置: 首页 > article >正文

Thread类的基本用法

Thread类的基本用法

  • 🔎1.线程创建
    • 🌻继承Thread类
      • 🌼继承Thread重写run()方法
      • 🌼继承Thread匿名内部类
    • 🌻实现Runnable接口
      • 🌼实现Runnable接口重写run()方法
      • 🌼实现Runnable接口匿名内部类
    • 🌻使用Lambda表达式
  • 🔎2.线程中断
    • 🌻线程立即中断
    • 🌻稍等片刻中断
    • 🌻线程不中断
  • 🔎3.线程等待
  • 🔎4.线程休眠
  • 🔎5.线程的六种状态
  • 🔎结尾

🔎1.线程创建

线程创建的3种方式

  • 继承Thread类
  • 实现Runnable接口
  • 使用Lambda表达式

🌻继承Thread类

🌼继承Thread重写run()方法

class ExThread extends Thread {
    @Override
    public void run() {
        System.out.println("通过继承Thread类创建线程");
    }
}

public class Main{
    public static void main(String[] args) {
        Thread t = new ExThread();
        //启动线程
        t.start();
    }
}

🌼继承Thread匿名内部类

public class HomeWork {
    public static void main(String[] args) {
        Thread t = new Thread() {
            @Override
            public void run() {
                System.out.println("通过继承Thread类创建线程");
            }
        };
    }
}

🌻实现Runnable接口

🌼实现Runnable接口重写run()方法

class ExRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("通过实现Runnable接口创建线程");
    }
}

public class HomeWork {
    public static void main(String[] args) {
        ExRunnable runnable = new ExRunnable();
        Thread t = new Thread(runnable);
		//启动线程
        t.start();
    }
}

🌼实现Runnable接口匿名内部类

public class HomeWork {
    public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("通过实现Runnable接口创建线程");
            }
        });
    }
}

🌻使用Lambda表达式

public class HomeWork {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            System.out.println("使用Lambda创建线程"); 
        });
    }
}

🔎2.线程中断

线程中断就是让线程停下来
那么如何才能让线程停下来呢?
那就是让该线程的入口方法执行完毕

下面来简单介绍下3种线程中断的情况

1.线程立即中断
2.线程稍等片刻中断
3.线程不中断

举个栗子

你正在打游戏,然后你的女朋友打电话叫你去陪她逛街
这时候你有3个选择
1.立刻把游戏停了陪她逛街(线程立即中断)
2.和她说打完这把再去(线程稍等片刻中断)
3.直接把电话挂了,继续打游戏(线程不中断)

下面来看下代码

🌻线程立即中断

public class Main {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            //currentThread是获取到当前线程的实例
            //此处currentThread()得到的对象就是t
            //isInterrupted()是t对象自带的标志位-->默认是false
            //可以理解成while(!false) --> while(true) --> 死循环
            while(!Thread.currentThread().isInterrupted()) {
                System.out.println("hello t1");
                try {
                    //休眠0.5s
                    Thread.sleep(500);
                } catch(InterruptedException e) {
                    e.printStackTrace();
                    break;
                }
            }
            System.out.println("线程立即中断");
        });

        //启动线程
        t.start();

        try {
            //休眠3s
            Thread.sleep(3000);
        } catch(InterruptedException e) {
            e.printStackTrace();
        }

        t.interrupt();//将标志位设置为true
    }
}

🌻稍等片刻中断

public class Test1 {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while(!Thread.currentThread().isInterrupted()) {
                System.out.println("hello t2");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException ee) {
                        ee.printStackTrace();
                    }
                    break;
                }
            }
            System.out.println("线程稍等片刻中断");
        });

        //启动线程
        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t.interrupt();
    }  
}

🌻线程不中断

public class Test1 {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while(!Thread.currentThread().isInterrupted()) {
                System.out.println("hello t3");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程不中断");
        });

        //启动线程
        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t.interrupt();
    }
}

🔎3.线程等待

在这里插入图片描述

等于这上述代码
我们无法确定打印顺序
先输出hello t 还是先输出hello bibu

在这里插入图片描述

但在main线程加入了t.join()(线程等待)之后,就会先去打印hello t了

这是因为在main线程中加入t.join(),如果此时的 t线程还没有执行完,main线程就会发生堵塞
也就是说,等到 t线程执行完毕后再去执行main线程的程序

需要注意的是

  • 在t1线程中调用t2.join(),就是t2先执行完毕再去执行t1
  • 在t2线程种调用t3.join(),就是t3先执行完毕再去执行t2
  • t.join()这个方法也可以设置一个时间

在这里插入图片描述

解释

  • 这里设置的时间就是说最多等待 t线程执行1000ms(1s),如果还没有执行完.那main线程就会继续执行
  • 举个栗子
    • 你的女朋友让你在她宿舍楼下等她10分钟
    • 你可以选择一直等着她( t.join())
    • 也可以选择就等10分钟( t.join(1000))

🔎4.线程休眠

让线程进入一定时间的停止

public class Main{
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while(true) {
                try {
                    //让线程进入休眠
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        
        t.start();
    }
}

🔎5.线程的六种状态

  • NEW: 安排了工作, 还未开始行动
  • RUNNABLE: 就绪状态. 又可以分成正在工作中和即将开始工作
  • TERMINATED:系统中的线程已经执行完了,Thread对象还在
  • TIMED_WATING:指定时间等待
  • BLOCKED:等待出现状态
  • WAITING:使用wait方法出现的状态

具体参考: 多线程的几种状态

🔎结尾

如果大家有什么不太理解的,可以私信或者评论区留言,一起加油


http://www.kler.cn/a/2675.html

相关文章:

  • 大模型LLM-Prompt-CRISPE
  • 深入Android架构(从线程到AIDL)_18 SurfaceView的UI多线程02
  • 将txt转成excel正则化公式的调整
  • 阻抗(Impedance)、容抗(Capacitive Reactance)、感抗(Inductive Reactance)
  • 汇编实现函数调用
  • Express 加 sqlite3 写一个简单博客
  • linux信号理解
  • spring5(四):IOC 操作 Bean 管理(基于注解方式)
  • SQL优化13连问,收藏好!
  • Docker常规安装简介
  • windows微服务部署
  • 天猫2月咖啡行业数据分析(咖啡品牌销量排行)
  • 面试--每日一经
  • ThinkPHP02:路由
  • STM32MP157-QT-串口调试助手设计
  • python常见算法(chatgpt算法实现)
  • PH电极酸碱度检测
  • 使用@Aspect和@Before注解以及全局异常拦截
  • NX二次开发 图层函数总结
  • I2C和SPI总线以及通信
  • Springboot Long类型数据太长返回给前端,精度丢失问题 复现、解决
  • Oracle数据库从入门到精通系列之一:定义数据库和实例
  • DevOps系列文章 - K8S构建Jenkins持续集成平台
  • 一文了解Jackson注解@JsonFormat及失效解决
  • 功能测试转型测试开发年薪27W,又一名功能测试摆脱点点点,进了大厂
  • 字节跳动测试岗面试记:二面被按地上血虐,所幸Offer已到手...