1.线程等待通知
就像做完饭,通知你来做一些事情
比如说
A线程在条件不满足时候进入等待状态,B线程修改了条件之后,A线程满足了条件,就不会去等待了,而是去执行了,对吧
A线程条件满足之后,就会去执行,
wait方法,可以让当前线程进入等待状态。
wait()状态线程被唤醒之后,还是会接着去同步代码块里将自己没执行完了的代码去给执行完成。
这个时候线程并不是阻塞状态,只是wait状态,因为锁没了
比较有意思哈,虽然没阻塞,但是和阻塞了差不多,因为锁没了。
相当于带上锁,去上厕所到一半被人给赶出来了,然后只能没办法把锁交出去了。
Noticy方法可以直接唤醒线程,将睡着的线程直接唤醒,然后参与进来。
将正在睡眠的线程直接唤醒,然后继续执行。多个等待线程的话,只能唤醒一个。notify方法并不会立刻释放锁对象,同步代码块执行完了才会去释放锁对象。所以一般放到最后去执行。
wait方法等待的线程,没有被唤醒就会一直等待,非常专一,这和阻塞状态不一样,阻塞状态线程,只是没抢到锁而已,会一直等待机会去抢锁,抢到了就就会进行执行
wait状态,由锁对象来执行,相当于是锁自己想要走了,觉得主人是个傻逼,我自己要离开了,什么时候我觉得主人变得还可可以了,我会Notify主人,但是窝不愿意时候,主人永远没办法强迫窝
notify就是我们认位上一个wait状态主人条件已经满足了,可以了,你可以选择回来了但是我要将目前同步代码块里代码都执行完成才能让你回来。
被对象Await朱的线程,也只能被对象A进行唤醒,解铃还须系铃人。
notify并不会立即放弃锁对象,线程要等待自己同步代码块执行结束之后才会释放锁对象。并不会立即释放锁
将锁对象看作一个女神的话,女神看不上屌丝,就会立即离开(wait状态立刻执行)
notify就是女神自己看屌丝变好了,然后还要由于一下看新的男朋友完全不行了,才会离开。
interrupt方法会打断线程的中断状态,并且抛出异常。
线程如果意外终止也会释放自己的锁对象,毕竟除了问题不能占着茅坑不拉屎。
notifyALL方法可以唤醒所有的线程。
唤醒同一个锁下面所有线程。所有被这一个锁给弄成wait状态线程全部都被唤醒了
wait(long)在指定时间内,没有被唤醒的线程超过时间之后也会被自动唤醒的,防止信号丢失,就是不要永远追求一个女神,超过一定伤感时间之后,就会意识到女神不是所有。
实际上可能会出现通知过早或者过晚的情况的
我们在t2里设置了notify方法进行通知唤醒,t1里设置了沉睡
但是线程调度器本质上其实是不确定进行调度的,也就是说这两个东西哪个最先被调度起来是不一定的
有可能是t2,也有能是t1这就有可能t2先进行通知,但是锁下面没有任何被沉睡的对象,也就是鱼塘里没有鱼。
实际上开发中有可能会出现通知过早问题
当集合为空时候进行等待状态,list可以作为一个判断等待的一个锁,用list自己作为锁,进行等待。
然后等待结束后,又会去执行同步代码块里,接着的数据
相当于被唤醒了之后,继续去执行后面的数据去执行。
2.join线程加入
3.thread
通过管道进行线程之间数据通信
通过管道流可以读取数据,在线程之间读取释放数据局。