多线程间通信-示例
之间是很多线程都在执行同一项任务,但是现在他们处理的任务不同(处理的还是同一资源)。
线程间通信-等待唤醒机制(握手机制)
应该有个判断里面是否有资源的标记flag,判断是否有资源。
如果里面有资源的话,应该输出开始操作,而输入应该先释放执行权,再释放执行资格,处于冻结状态。Sleep、wait。
If(flag)
输出处于wait
那么输出就可以运行了。
等待唤醒机制涉及的方法:
1. wait():让线程处于冻结状态,释放cpu的执行权和执行资格,被wait的线程会被存储到线程池(等待集)中。
2. Notify():唤醒线程池中的一个线程(任意)。
3. NotifyAll():唤醒线程池中的所有线程。
在之前的代码基础上加入了flag判断机制
这些方法都必须定义在同步中。因为这些方法是用于操作线程状态的方法。必须明确到底操作的是哪个锁上的线程。
为什么操作线程的方法wait notify notifyAll定义在Object类中。因为这些方法是监视器的方法,监视器其实就是锁。锁可以是任意对象,任意对象调用的方法一定定义在Object类中。
等待唤醒机制-代码优化
多生产者多消费者问题(暂时跳过)
Wait和sleep的区别
1.Wait可以指定时间,也可以不指定。Sleep必须指定时间
2.在同步中时,对cpu的执行权和锁的处理不同。
Wait:释放执行权,释放执行权,但是不释放锁(我猜错了)释放锁。
Sleep:释放执行权,不释放锁。
停止线程方式-定义标记
1. stop方法(已过时)
2. Run方法结束
怎么控制线程的任务结束呢?
任务中都会有循环结构,只要控制住循环就可以结束任务。控制循环通常就用定义标记来完成。
守护线程-setDaemo(boolean daemon)更改线程组后台状态
将该线程标记为守护线程或用户线程。当正在运行的线程均是守护线程时,java虚拟机退出。(和前台联合起来,前台没了,我就没了,和前台保持一致)
其他方法-join等(等待该线程终止)
主线程等待其他线程终止以后。(主线程交出执行资格,自身处于冻结状态)
临时加入一个线程运算可以使用join方法。
线程还涉及到优先级的问题,能够获取到cpu的几率。优先级越大,获取的几率越高。
T(线程).setPriority()可以设置线程的优先级,里面传的参数就是设置的优先级。
PS:还剩集合和IO,加油好好学。