您当前的位置: 首页 >  Java

java持续实践

暂无认证

  • 3浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java多线程 join遇到中断&join期间线程状态的两种查看方式

java持续实践 发布时间:2020-08-30 14:32:40 ,浏览量:3

文章目录
      • join期间遇到中断的demo
      • join期间线程状态的两种查看方式
        • 通过getState()查看线程状态
        • 通过断点的方式查看状态

join期间遇到中断的demo

如下的代码演示了join期间被中断的情况. 用Thread.currentThread() 获取main线程. 并在子线程的run方法中, 把main线程中断. 需要注意的是, 如果main线程被中断了, 那么也要把子线程中断掉, 以保证数据的一致性, 即在如下的代码中thread.interrupt();

package com.thread.threadobjectclasscommonmethods;

import java.util.concurrent.TimeUnit;

/**
 * 类名称:JoinInterrupt
 * 类描述:演示join期间被中断的效果
 *
 * @author: https://javaweixin6.blog.csdn.net/
 * 创建时间:2020/8/30 13:40
 * Version 1.0
 */
public class JoinInterrupt {

    public static void main(String[] args) {
        //拿到主线程
        Thread mainThread = Thread.currentThread();

        Thread thread = new Thread(() -> {
            try {
                //子线程对主线程进行中断
                mainThread.interrupt();
                TimeUnit.SECONDS.sleep(5);

                System.out.println("run方法中  子线程执行完毕了 ");
            } catch (InterruptedException e) {
                e.printStackTrace();
                System.out.println("run方法中 子线程中断");
            }
        });

        thread.start();
        System.out.println("等待子线程运行完毕");

        try {
            //是子线程加入到我们(main线程在等待子线程的过程中被中断了).
            thread.join();
        } catch (InterruptedException e) {

            //主线程被中断, 主线程抛出异常
            System.out.println(Thread.currentThread().getName() + " 主线程中断了");
			
			//如果main线程被中断了, 那么也把子线程中断, 以保证线程的一致性 
            thread.interrupt();
            e.printStackTrace();
        }
        System.out.println("main方法中 子线程运行完毕了 ");
    }
}

程序打印如下. main线程中, 执行了thread.join(); ,开始等待子线程. 在等待子线程的过程中, 被中断了. 因此打印出了main 主线程中断了 , 接着把子线程也中断了, 因此抛出了两个被中断的异常. 第一个为main线程的中断异常, 第二个为子线程在sleep过程中的中断异常.

join期间线程状态的两种查看方式 通过getState()查看线程状态

如下的代码, 演示了join期间, 线程状态的查看方式, 主要是调用了main线程的mainThread.getState() 来查看线程的状态. 用于main线程在join期间, 等待子线程的状态查看 .

package com.thread.threadobjectclasscommonmethods;

/**
 * 类名称:JoinThreadState
 * 类描述:先join再mainThread.getState()
 * 通过debugger看线程join前后状态的对比
 *
 * @author: https://javaweixin6.blog.csdn.net/
 * 创建时间:2020/8/30 14:08
 * Version 1.0
 */
public class JoinThreadState {

    public static void main(String[] args) throws InterruptedException {
        Thread mainThread = Thread.currentThread();

        Thread thread = new Thread(() -> {
            try {
                Thread.sleep(3000);

                //休眠完成后, 就获取main线程的状态
                System.out.println(mainThread.getState());
                System.out.println(Thread.currentThread().getName() + "运行结束");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "thread1");

        thread.start();
        System.out.println("开始等待子线程运行完毕");
        thread.join();
        System.out.println("子线程运行完毕");
    }

}

控制台打印如下, 可以看到join期间, main线程的状态为 WAITING

通过断点的方式查看状态

将断点打在如下的两个地方 debug运行后, 可以看到main线程为running, 而子线程为sleeping休眠中 进入下一个断点后, 子线程为running, 而main线程为wait 等待状态.

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0411s