JAVA基础:线程生命周期、中断线程的方法

1 线程生命周期

 

2 中断线程的方法

2.1 Thread.sleep()方法

  • Thread类的一个静态方法

  • 让当前正在执行的线程处于睡眠状态

  • 指定睡眠时间,时间过后,自动唤醒,唤醒后,线程进入就绪状态,准备争抢CPU

  • 睡眠期间,一旦被其他线程调用了当前线程的interrupt方法中断,会抛出异常

  • 如果线程抢占了一个对象锁,睡眠期间不会释放对象锁。

2.2 Thread.yield()方法

  • 让步,当前线程让出CPU,与其他线程重新争抢CPU

2.3 thread.join()方法

  • 插队,当前线程调用指定线程对象的join方法,将指定线程加入当前线程的执行序列

  • 当指定线程执行完毕后,当前线程才会继续执行。(此时直接处于运行状态)

    通过底层原码可知,join方法会不挺的检测线程的存活状态

    当目标线程执行完毕后,自动销毁,不再存货

    当前线程一旦发现目标线程销毁,则继续执行自己的操作。在判断时一定已经获得cpu了

  • 最常用的就是通过join方法,实现确保所有的其他线程都执行完毕,当前线程再继续执行。

2.4 object.wait()方法

  • 这是Object对象的方法,也是所有对象都拥有的方法

  • 该方法必须用在同步方法或同步代码段中

    因为线程要想执行同步方法或同步代码段,需要先获得对应的锁对象

  • 在同步方法或同步代码段中,获得的是哪个对象的对象锁,才可以调用哪个对象的wait方法

    表示让出当前对象的对象锁,获得当前对象锁的当前线程处于等待状态

    等待再次获得该对象的对象锁,才能继续执行剩下未完成部分代码

  • 一般多因为逻辑数据未达标,需要临时让出对象锁,让其他线程先执行。

  • 当其他线程使用完该对象的对象锁后,需要调用该对象的notify或notifyall方法唤醒等因为wait方法而等待该对象锁的线程。

  • wait的重载方法

    obj.wait()会一直等待,直到被另一个线程调用obj.notify or obj.notifyall唤醒

    obj.wait(time)会等待指定的毫秒数,自动唤醒,唤醒后如果依然没有获得锁,会继续等待

  • notify和notifyAll方法

    • 也需要在同步方法或同步代码段中使用,并且需要先确保获得了该对象的对象锁

    obj.notify()表示随机唤醒一个因为wait方法等待当前锁的线程

    obj.notifyAll()表示唤醒所有因为wait方法而等待当前锁的线程

  • 同步队列与等待队列

    • synchronized锁是依赖于系统级别的锁,称之为重量级锁

    • 在应用过程中,会产生两个队列

      • 一个称为同步队列,当多个线程因调用同步方法或同步代码段时,对同一把锁进行争抢

        当一个线程抢到,其他线程进入同步等待队列

      • 一个称为条件队列,当一个线程已经获得了对象锁,因为某些业务条件不支持,

        不得不通过wait方法让出锁,同时重新等待这把锁

        此时当前线程会被存入条件等待队列

        notify方法唤醒的是条件等待队列中的线程。

        唤醒之后,条件等待队列中的线程会被加入同步等待队列

    • 当线程1234按顺序争抢锁时,线程1获得锁, 线程234进入同步队列

      当线程1使用完毕,释放锁后, 同步队列中的线程会按照倒序依次被唤醒

      系统级别的同步队列是一个倒序唤醒过程,不代表所有的同步队列都是这个顺序(如:lock)

2.5 lock的wait等待

  • lock是synchronized的代替方案

  • 所以也提供了类似于synchronized配合wait相关的功能

  • 注意:这里使用的不是lock对象的wait方法

  • 通过lock对象可以获得一个condition对象,表示条件对象

    当业务逻辑中不满足某些条件的时候,可以基于Condition条件对象进行等待

    Condition condition = lock.newCondition();

  • 当业务执行时,遇到等待条件,通过调用condition.await(); // "buka".wait()线程等待

    进入等待队列

  • 当另一个线程使用完锁之后,通过调用condition.signal() or singalAll()唤醒线程

    将等待队列中的线程重新加入同步队列

public static void main(String[] args) throws InterruptedException {
        Lock lock = new ReentrantLock();
        //这就是用来表示i==5的这个等待条件
        Condition condition = lock.newCondition();
        Thread t1 = new Thread(()->{
            lock.lock();
            for(int i=1;i<=10;i++){
                System.out.println(i);
                Thread.sleep(1000);
                
                if( i == 5 ){
                    condition.await(); // "buka".wait()
                }
            }
            lock.unlock();
        });
        t1.start();

        Thread.sleep(10);

        Thread t2 = new Thread(()->{
            lock.lock();
            for(int i=11;i<=20;i++){
                System.out.println(i);
            }
            condition.signal();
            lock.unlock();
        });
        t2.start();
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值