Java多线程(二):线程的常用方法和状态_"java的new thread (thread, "窗口1 ")(1)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

        while (!Thread.interrupted()) {
            System.out.println("正在交易.....");
        }
        System.out.println("啊?险些误了大事!");
        System.out.println("终止标志位2:" + Thread.currentThread().isInterrupted());
        System.out.println("终止标志位2:" + Thread.currentThread().isInterrupted());
        System.out.println("终止标志位2:" + Thread.currentThread().isInterrupted());
        System.out.println();
        System.out.println("终止标志位4:" + Thread.interrupted());
        System.out.println("终止标志位4:" + Thread.interrupted());
        System.out.println("终止标志位4:" + Thread.interrupted());
    });
    thread.start();
    Thread.sleep(100);

    // 终止线程
    thread.interrupt();

    System.out.println("有内鬼,终止交易!");
}

运行结果:


![](https://img-blog.csdnimg.cn/6b1b164857664f088d302e61b7c56a12.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5r6E55m95piT,size_20,color_FFFFFF,t_70,g_se,x_16)


**停止线程的 3 种方法**:[https://juejin.cn/post/7069920237558169613](https://bbs.csdn.net/topics/618668825)



### 1.2 线程等待 join—李四接班


         有时,我们需要等待⼀个线程完成它的工作后,才能进行自己的下⼀步工作。例如,李四只有等张三下班了他才上班,这时我们需要⼀个方法明确等待线程的结束。


 ![](https://img-blog.csdnimg.cn/06a56fb6168045e5b946eecf696a224c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5r6E55m95piT,size_20,color_FFFFFF,t_70,g_se,x_16)




public static void main(String[] args) throws InterruptedException {
    Thread t1 = new Thread(() -> {
        // 张三开始上班
        System.out.println("1.张三开始上班:" + LocalDateTime.now());
        // 张三正在上班
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 张三下班
        System.out.println("3.张三下班:" + LocalDateTime.now());
    });
    // 启动线程
    t1.start();

    // 等待线程1执行完之后再执行后面的代码
    t1.join();

    Thread t2 = new Thread(() -> {
        // 李四开始上班
        System.out.println("1.李四开始上班:" + LocalDateTime.now());
        // 李四正在上班
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 李四下班
        System.out.println("3.李四下班:" + LocalDateTime.now());
    });
    // 启动线程
    t2.start();
}

运行结果:


![](https://img-blog.csdnimg.cn/f8ffbe0a02a74d66b6199ddb10579328.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5r6E55m95piT,size_20,color_FFFFFF,t_70,g_se,x_16)



### 1.3 yield 让出执行权


我们可以使用 yield 让出执行权,如下代码所示:



public static void main(String[] args) {
    Thread thread = new Thread(() -> {
        // 得到当前线程
        Thread t = Thread.currentThread();
        for (int i = 0; i < 100; i++) {
            // 让出CPU执行权
            Thread.yield();
            System.out.println("执行了线程" + t.getName());
        }
    }, "张三");
    thread.start();

    new Thread(() -> {
        // 得到当前线程
        Thread t = Thread.currentThread();
        for (int i = 0; i < 100; i++) {
            System.out.println("执行了线程" + t.getName());
        }
    }, "李四").start();
}

运行结果:


![](https://img-blog.csdnimg.cn/55a011ead34c4dac93fbc9684c148ae2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5r6E55m95piT,size_20,color_FFFFFF,t_70,g_se,x_16)


可以看到,使用 yield 时, 张三的数量远远少于李四 。


结论 :yield 不改变线程的状态, 但是会重新去排队,而排队之后选择谁是不确定的。



### 1.4 获取当前线程


### 


 这个方法我们已经很熟悉了,下面看一个例子:



public static void main(String[] args) {
    Thread thread = Thread.currentThread();
    System.out.println(thread.getName());
}

运行结果:


![](https://img-blog.csdnimg.cn/f7ae89a5d2244870960a35a05e7bb629.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5r6E55m95piT,size_20,color_FFFFFF,t_70,g_se,x_16)


当前线程为主线程。



### 1.5 休眠当前线程


休眠线程有两种实现:


* 使用 sleep 休眠
* 使用 TimeUnit 休眠


#### 1.5.1 使用 sleep 休眠


![](https://img-blog.csdnimg.cn/140542404eff4bc48a625a4445645dec.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5r6E55m95piT,size_20,color_FFFFFF,t_70,g_se,x_16)



public static void main(String[] args) throws InterruptedException {
    Thread thread = new Thread(() -> {
        try {
            Thread.sleep(60 * 1000);
        } catch (InterruptedException e) {
            System.out.println("接受到了线程终止的通知");
        }
    });
    thread.start();

    Thread.sleep(1000);
    System.out.println("终止子线程");
    thread.interrupt();
}

 运行结果:


![](https://img-blog.csdnimg.cn/3caaf93337c247f0a9a9dd58d07bce36.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5r6E55m95piT,size_20,color_FFFFFF,t_70,g_se,x_16)


#### 1.5.2 使用 TimeUnit 休眠



TimeUnit.DAYS.sleep(1);//天
TimeUnit.HOURS.sleep(1);//⼩时
TimeUnit.MINUTES.sleep(1);//分
TimeUnit.SECONDS.sleep(1);//秒
TimeUnit.MILLISECONDS.sleep(1000);//毫秒
TimeUnit.MICROSECONDS.sleep(1000);//微妙
TimeUnit.NANOSECONDS.sleep(1000);//纳秒


下面看看源码: 


 ![](https://img-blog.csdnimg.cn/3131dabbcc36427ab551a2f36a36a12d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5r6E55m95piT,size_20,color_FFFFFF,t_70,g_se,x_16)


 可以看到 TimeUnit 底层也是通过 sleep 实现的。



## 2.线程状态


### 2.1 所有的线程状态



    for (Thread.State item : Thread.State.values()) {
        System.out.println(item);
    }

![](https://img-blog.csdnimg.cn/bdd2ed2aaee94778a337194390d037ac.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5r6E55m95piT,size_20,color_FFFFFF,t_70,g_se,x_16)


**可以看到总共有六种状态:**


* NEW(新建): 线程被创建,但是还未启动(start)
* RUNNABLE(运行): 可工作的.,又可以分成正在工作中和即将开始工作
* BLOCKED(阻塞): 如果遇到锁,线程就会变为阻塞状态,等待另一个线程释放锁
* WAITING(等待): 无限期等待
* TIMED\_WAITING(超时等待): 有明确结束时间的等待状态
* TERMINATED(终止): 线程结束完成


![](https://img-blog.csdnimg.cn/9fdf0dae879142f8b314ecceafe72c04.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5r6E55m95piT,size_20,color_FFFFFF,t_70,g_se,x_16)



### 2.2 线程状态转变


![](https://img-blog.csdnimg.cn/adbaad6ddb644379b978d694b8e81aae.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5r6E55m95piT,size_20,color_FFFFFF,t_70,g_se,x_16)


 这个图看着挺复杂,下面用一个例子加以解释:


![](https://img-blog.csdnimg.cn/0e079f3b4c674d7699afdc46a880a134.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5r6E55m95piT,size_20,color_FFFFFF,t_70,g_se,x_16)


         刚把李四、王五找来,还是给他们在安排任务,没让他们行动起来,就是 NEW 状态;


        当李四、王五开始去窗口排队,等待服务,就进入到 RUNNABLE 状态。**该状态并不表示已经被银行工作⼈员开始接待,排在队伍中也是属于该状态,即可被服务的状态,是否开始服务,则看调度器的调度**。


         当李四、王五因为⼀些事情需要去忙,例如需要填写信息、回家取证件、发呆⼀会等时,进入 BLOCKED、WATING、TIMED\_WAITING 状态。


        如果李四、王五已经忙完,为 TERMINATED 状态。


**观察线程状态的转换:**




![img](https://img-blog.csdnimg.cn/img_convert/33736f14323683120644fe04d3ce1f2b.png)
![img](https://img-blog.csdnimg.cn/img_convert/720ad50d6807f598fac7873f4ad35ba4.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**


[外链图片转存中...(img-cELckyUe-1715836723653)]
[外链图片转存中...(img-nxIMg0WG-1715836723653)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值