JAVA_Lesson14(传智播客笔记之多线程)

多线程间通信-示例

之间是很多线程都在执行同一项任务,但是现在他们处理的任务不同(处理的还是同一资源)。


线程间通信-等待唤醒机制(握手机制)

应该有个判断里面是否有资源的标记flag,判断是否有资源。



如果里面有资源的话,应该输出开始操作,而输入应该先释放执行权,再释放执行资格,处于冻结状态。Sleepwait

Ifflag

输出处于wait

那么输出就可以运行了。

等待唤醒机制涉及的方法:

1. wait():让线程处于冻结状态,释放cpu的执行权和执行资格,被wait的线程会被存储到线程池(等待集)中。

2. Notify():唤醒线程池中的一个线程(任意)。

3. NotifyAll():唤醒线程池中的所有线程。

在之前的代码基础上加入了flag判断机制

这些方法都必须定义在同步中。因为这些方法是用于操作线程状态的方法。必须明确到底操作的是哪个锁上的线程。

为什么操作线程的方法wait notify notifyAll定义在Object类中。因为这些方法是监视器的方法,监视器其实就是锁。锁可以是任意对象,任意对象调用的方法一定定义在Object类中。

等待唤醒机制-代码优化

多生产者多消费者问题(暂时跳过)

Waitsleep的区别

1.Wait可以指定时间,也可以不指定。Sleep必须指定时间

2.在同步中时,对cpu的执行权和锁的处理不同。

Wait:释放执行权,释放执行权,但是不释放锁(我猜错了)释放锁

Sleep:释放执行权,不释放锁。

 

停止线程方式-定义标记

1. stop方法(已过时)

2. Run方法结束

怎么控制线程的任务结束呢?

任务中都会有循环结构,只要控制住循环就可以结束任务。控制循环通常就用定义标记来完成。

守护线程-setDaemo(boolean daemon)更改线程组后台状态

将该线程标记为守护线程或用户线程。当正在运行的线程均是守护线程时,java虚拟机退出。(和前台联合起来,前台没了,我就没了,和前台保持一致)

其他方法-join等(等待该线程终止)

主线程等待其他线程终止以后。(主线程交出执行资格,自身处于冻结状态)

临时加入一个线程运算可以使用join方法。

线程还涉及到优先级的问题,能够获取到cpu的几率。优先级越大,获取的几率越高。

T(线程).setPriority()可以设置线程的优先级,里面传的参数就是设置的优先级。

PS:还剩集合和IO,加油好好学。

猜你喜欢

转载自blog.csdn.net/wearlee/article/details/80895131