Java基础12天 学习笔记_多线程(线程间的通信,生产消费者,等待唤醒机制,while+notifyAll,lock+condition,interrupt()+异常中改变flag值,守护,join
来源:互联网 发布:民生银行mac网银控件 编辑:程序博客网 时间:2024/05/09 16:15
01线程间的通信,实例代码
不同的线程做不同的操作,如操作同一个资源时,一个input,一个output
资源~操作动作。
如果同步后还是发现同步失效,考虑前提: 1.是否多线程2,时候同一个锁
操作同一个资源!需要用单例模式,或者传入相同的对象。
if (x==0) else , x= (x+1)%2
为了合理的操作这
用等待唤醒机制让输入和输出和谐的进行、
内存中有线程池,等待的线程都存在线程池当中。
线程池的概念:
线程池的作用:
线程池作用就是限制系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
为什么要用线程池:
1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。
wait() ,和sleep(x),一样,都会抛出异常,所以需要用try , catch处理。
还有在使用wait时也需要表明,持有锁的线程, r.wait () ------持有r锁的线程等待,因为同步会出现嵌套。
/* Day12 , 多线程间的通信同一资源,不同的对象调用, 并使用多线程。*/class Res{String name;String sex;Boolean flag=false;}class Input implements Runnable{private Res r;Input (Res r){this.r=r;}public void run(){int x=0;while (true){synchronized (r){if (r.flag){try{r.wait();}catch (Exception e){}}if (x==0){r.name="Jerry";r.sex="Boy";}else {r.name="安娜";r.sex="女";}x=(x+1)%2;r.flag = true;r.notify();}}}}class Output implements Runnable{private Res r;Output(Res r){this.r=r;}public void run(){while (true){synchronized (r){if (!r.flag){try{r.wait();}catch (Exception e){}}System.out.println("姓名"+r.name+"---性别"+r.sex);r.flag=false;r.notify();}}}}class InputOutputDemo{public static void main(String[] args) {Res resource= new Res();Input i=new Input(resource);Output o= new Output(resource);Thread a=new Thread(i);Thread b=new Thread(o);a.start();b.start();}}
构造函数也会涉及到锁,同步,等待唤醒机制
代码经过优化,把构造函数添加this锁,同步,等待和唤醒机制。
class Res{private String name;private String sex;Boolean flag=false;public synchronized void setValue (String name, String sex){if (flag){try{this.wait();}catch (Exception e){}}this.name=name;this.sex=sex;flag=true;this.notify();}public synchronized void out(){if(!flag){try{this.wait();}catch (Exception e){}}System.out.println(name+"....."+sex);flag=false;this.notify();}}
05生产消费者例子
将计数器定义在资源中, this.name= name+"---"+count++
当有多个线程生产,多个线程消费时,会出现:
重复生产或者重复消费,
原因:在唤醒的时候没有判断flag,并不知道前面的生产者已经生产了一次。
解决:
将原来的if判断一次,变成while判断多次。+ notifyAll();
这是最常用的方式! while(flag) + notifyAll();
JDK 1.5后,加入了lock和condition,来替代 synchronized (锁)
lock.lock()
try
{
while (flag)
condition1.await();
xxxxx
xxx
xxxxx
flag= true;
condition2.signal
}
finally
{
lock.unlock(); //lock是资源,也需要finally来释放
}
lock加condition不用嵌套,就没有死锁问题,
而且可以定义多个condition,以组为单位来唤醒对方,不会出现所有都等待。
需要interrupt()----InterruptException----在异常处理中加入 changeFlag(),控制语句流程
线程有守护值,如果守护值为true,则在后台运行,当进程中所有的线程都是守护线程的时候虚拟机结束。
setDeamon(true)
t1.join(); ,t1要申请cpu执行权,要抢夺CPU执行权。
主线程碰到谁的Join就等谁。
优先级和Yield方法
养成习惯,数据固定的用常量,数据共享的用静态 , 如 Thread.MAX_PRIORITY
yield,临时释放,平均使用CPU
需要interrupt()----InterruptException----在异常处理中加入 changeFlag(),控制语句流程
线程有守护值,如果守护值为true,则在后台运行,当进程中所有的线程都是守护线程的时候虚拟机结束。
setDeamon(true)
t1.join(); ,t1要申请cpu执行权,要抢夺CPU执行权。
主线程碰到谁的Join就等谁。
优先级和Yield方法
养成习惯,数据固定的用常量,数据共享的用静态 , 如 Thread.MAX_PRIORITY
yield,临时释放,平均使用CPU
匿名内部类就可以完成这样的操作,在同一个类中开启多线程。
或者 Runnable r= new Runnable(){覆盖run()}
new Thread(r).start();
- Java基础12天 学习笔记_多线程(线程间的通信,生产消费者,等待唤醒机制,while+notifyAll,lock+condition,interrupt()+异常中改变flag值,守护,join
- 线程间通信 等待唤醒机制 wait notify notifyAll lock Condition唤醒 停止线程interrupt 守护线程setDaemon join yield
- day12线程间的通信,等待唤醒机制,生产者消费者问题。新锁lock(): 守护线程,interrupt()停止线程用,join()yield()
- Java基础 多线程 解决安全问题 等待唤醒机制 Lock Condition interrupt join setPriority yield
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- 线程间通信、等待唤醒机制、生产者消费者问题(Lock,Condition)、停止线程和守护线程、线程优先级
- 【我的Java笔记】多线程_等待唤醒机制(生产消费者模式)
- Java基础学习5_多线程(线程间通信--等待唤醒机制)
- 黑马程序员_JavaSE基础14 之 线程间通信 等待唤醒机制 多生产多消费者 ...
- java多线程-线程间通信-示例代码-解决安全问题-等待唤醒机制wait()notify()notifyAll()
- java多线程之 生产者和消费者 线程间通信 等待与唤醒机制
- java基础12:线程间通信----等待唤醒机制
- Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例
- java多线程Lock Condition生产消费者
- Java多线程四:线程间通信/等待唤醒机制
- java多线程(2):线程通信之生产者消费者模式及等待唤醒机制
- 多线程学习笔记(四)之线程间通信---等待唤醒机制
- Android程序员必备精品资源
- 关于play框架
- 【docker】docker开源项目
- Python 将HTML转换为TXT
- 清除浮动clear-left-right-both-none效果
- Java基础12天 学习笔记_多线程(线程间的通信,生产消费者,等待唤醒机制,while+notifyAll,lock+condition,interrupt()+异常中改变flag值,守护,join
- 求一个链表的中间的节点
- C++内存管理
- kettle中访问前一行数据
- SCSS loader effect
- 实现JS数组的深拷贝
- 检查处理kettle数据流中的空行
- Custom Data Objects
- 堆(heap)和栈(stack)、内存泄漏(memory leak)和内存溢出