java多线程(2) wait notify notifyall sleep stop interrupt join

多线程的wait notify notifyall sleep stop interrupt join

wait notify

wait notify 都是object根类上的方法(貌似现在不太常用)

wait调用之前

wait方法调用之前要先获得该对象的监视器锁,否则会报IllegalMonitorStateException异常
获得监视器锁的方式主要有

  1. Synchronized(Object)
  2. synchronized void dosomething(){}

wait调用后

线程调用共享对象上的wait()后会被阻塞,此线程就进入到此对象的等待对列中,此时线程释放此对象的监视器锁

wait被打断

线程wait sleep yield 被阻塞时,会抛出InterruptedException

唤醒以及notify notifyall的区别

notify就是随机唤醒一个在此对象上等待/被阻塞 的线程
notifyall唤醒所有此对象等待队列上的线程,竞争一个此锁

sleep(long ms)

让调用它的线程休眠一段时间 ,同样被中断也会抛出InterruptedException,但是与wait()不同是此线程不会让出监视器资源,不会释放锁。

stop()

强行中断此线程,但是容易带来线程安全问题,属于被抛弃的方法

interrupt()

与stop()方法不同的是,interrupt()方法并不会强制中断此线程,而是设置一个中断标记,与之配套的isinterrupted()方法则会去判断是否有中断标记,通过

if(Thread.currentedThread().isinterrupted()){
break;
}

或者

while(!Thread.currentedThread().isinterrupted()){
do thread job…}

等方法退出这个线程。

isinterrupted()与interrupted()的区别

interrupted()判断的当前线程的中断情况 同时会清除中断标记
isinterrupted()判断的是调用它的线程的中断情况

join()

调用它的线程会被阻塞,直到join对应的线程结束。例如

public static void main(String []args){
threada.join();
threadb.join();
System.out.println(“main”);
}

main线程调用threada.join();随后被阻塞,直到thread跑完;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值