文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Thread 类基本用法详解

2023-10-02 19:23

关注

Thread 类基本用法详解

Thread类的作用

Thread是Java操作多线程最核心的类。

线程创建

Java中创建线程的方法有很多种!!!

继承 Thread, 重写 run

//继承Thread类并重写run方法创建一个线程class Thread01 extends Thread{    @Override    public void run() {        System.out.println("hello,thread");    }}public class ThreadDemo {    public static void main(String[] args) {        //实例化一个线程对象        Thread01 t=new Thread01();        //真正去申请系统线程,参与CPU调度        t.start();    }}

实现 Runnable, 重写 run

//通过继承Runnable接口并实现run方法class MyRunnable implements Runnable{    @Override    public void run() {        System.out.println("hello,thread");    }}public class ThreadDemo {    public static void main(String[] args) {         //实例化Runnable对象        MyRunnable runnable=new MyRunnable();        //实例化线程对象并绑定任务        Thread t=new Thread(runnable);        t.start();    }}

继承 Thread, 重写 run, 使用匿名内部类

 //通过Thread匿名内部类的方法创建一个线程public static void main(String[] args) {       Thread t=new Thread(){            //指定线程任务            @Override            public void run() {                System.out.println(Thread.currentThread().getName());            }        };        t.start();}

实现 Runnable, 重写 run, 使用匿名内部类

//通过Runnable匿名内部类创建一个线程   public static void main(String[] args) {      Thread t=new Thread(new Runnable() {          //指定线程的任务          @Override          public void run() {              System.out.println(Thread.currentThread().getName());          }      });      t.start();   }

使用 lambda 表达式(最推荐)

//通过Lambda表达式的方式创建一个线程public static void main(String[] args) {    Thread t=new Thread(()->{        System.out.println("Hi");    });    t.start();}

上述方法,只是语法规则不同,本质上是一样的方式,创造出的线程并无不同。

面试题一:请说明Thread类中run和start的区别
答案:
作用功能不同:
a.run方法的作用是描述线程具体要执行的任务;
b.start方法的作用是真正在操作系统内核里创建线程,并让新线程调用run方法。
运行结果不同:
a.run方法是一个类中的普通方法,主动调用和调用普通方法一样,会顺序执行一次。
b.start调用方法后,start方法内部会调用Java本地方法(封装了对系统底层的调用)真正的启动线程,并执行run方法中的代码,run方法执行完成后,线程进入销毁阶段。

线程中断

中断的意思不是指让线程立即就停止,而是通知线程应该要停止,是否真的停止,取决于线程这里具体的代码写法。

1.使用标志位来控制线程是否要停止

    public static boolean flag=true;    public static void main(String[] args) throws InterruptedException {        Thread t=new Thread(()->{            while (flag){                System.out.println("hello Thread");                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        });        t.start();        Thread.sleep(3000);        //在主线程里就可以随时通过flag变量的取值,来操作t线程是否结束        flag=false;    }
  • 自定义变量这种方式不能及时响应,尤其是在sleep休眠的时间比较久的时候。
  • 这个代码之所以能够起到修改flag, t线程就结束,完全取决于 t 线程内部的代码。
  • 代码里通过flag控制循环。因此这里只是告诉让这个线程结束,这个线程是否要结束,啥时候结束,都取决于 t 线程内部代码。

2.使用Thread自带的标志位来控制线程是否要停止

public static void main(String[] args) throws InterruptedException {    Thread t=new Thread(()->{        while (!Thread.currentThread().isInterrupted()){            System.out.println("hello Thread");            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    });    t.start();    Thread.sleep(3000);    t.interrupt();}

Thread.currentThread():这是Thread类的静态方法,通过这个方法可以获取到当前线程,哪个线程调用这个方法,就得到哪个线程的对象引用,类似于this。
isInterrupted():判断线程是否终止,为true表示被终止,为false表示未被终止。
t.interrupt() :在上述代码中,主线程调用t.interrupt(),相当于主线程通知 t 线程要终止。

在这里插入图片描述

此处interrupt会做两件事:
1.把线程内部的标志位(boolean)给设置成true。
2.如果线程在进行sleep,就会触发异常,把sleep唤醒。
注意:
在唤醒sleep的时候,会把刚才设置的这个标志位,再设置回false。(清空了标志位)
这就导致上述代码在sleep的异常被catch完了之后,循环还要继续执行!!
上述代码执行结果:
在这里插入图片描述
问题一:为啥sleep要清除标志位?
唤醒sleep之后,线程到底是否要终止,到底是立即终止还是稍后终止,取决于线程内部代码。

线程等待

线程等待是指一个线程在执行过程中暂停自己的运行,并等待其他线程完成一定的操作后再继续执行。简单来说,就是控制多个线程的执行顺序。
线程等待的实现方式有很多种,其中最常见的方式是使用线程的join()方法。当一个线程调用另一个线程的join()方法时,它会被阻塞,直到被调用的线程执行完毕并退出。

在这里插入图片描述
上述代码执行结果:
在这里插入图片描述

来源地址:https://blog.csdn.net/m0_63904107/article/details/130982938

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯