Thread中几个常用的api详解join,interrupt

1.join()

join方法可以在多线程中帮我们实现调用线程的同步效果,比如,现在有三个线程,a,b,c

a中启动了b和c线程异步去执行一件事,但是a希望他们做完以后再继续往下执行,那么就可以在调用b和c启动之后,调用每个线程的join方法,意思是等待它们执行完毕,代码如下:

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread() {
            @Override
            public void run() {
                System.out.println("我是线程1");
            }
        };
        Thread thread1 = new Thread() {
            @Override
            public void run() {
                System.out.println("我是线程2");
            }
        };
        thread.join();
        thread1.join();

        System.out.println("我是主线程");
    }

2.interrupt()

这个方法可以理解成打断线程的当前状态,有以下几个场景啊:我们通常可以用来实现通过一个线程,控制另一个线程是否运行,在需要通知另一个线程的时候调用interrupt(),然后在停止的线程中有一个判断逻辑,判断当前线程的状态

  • 打断阻塞状态下的线程,比如调用了sleep或者是yield方法等,如果这个时候,别的线程调用了该线程的interrupt()方法,就会抛出一个interruptedException,并且把是否打断状态改为false
  • 打断正在运行的线程,意思就是正在执行别的代码,没有处于sleep或别的状态下,那么这个时候就会把,thread1.isInterrupted(),值改为true
  • 打断park,park就是让当前线程阻塞,调用该线程的interrupt(),可以让它继续向下运行,但是注意哦,park方法是否继续向下运行,依靠的是当前线程thread1.isInterrupted()是否为true,如果为true,则无法再次阻塞,意思就是假如一个线程调用了一次LockSupport.park()方法,此时另一个线程打断了它,那么它继续往下运行的时候,又调用了一次LockSupport.park()方法,是没办法阻塞的,因为这个时候当前线程的isInterrupted()为true,所以如果希望再次往下运行,可以在第一次park()方法的后边,调用Thread.Interrupted()方法,可以帮我们把打断状态改为false,使程序调用park()方法时可以再次阻塞,代码大致如下
        public static void main(String[] args) throws InterruptedException {
            Thread thread = new Thread() {
                @Override
                public void run() {
                    LockSupport.park();
    
                    System.out.printf("当前打断状态为%s\n",Thread.interrupted());
                    
                    LockSupport.park();
                    System.out.println("dssdsds");
                }
            };
            thread.start();
            thread.interrupt();
    
        }

猜你喜欢

转载自blog.csdn.net/weixin_59244784/article/details/132762250