为什么需要线程间的通信

多个线程并发执行时,在默认情况下CPU时随机切换线程的,当我们需要多个线程共同完成一件任务,并且

希望他们有规律的执行,那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。

如何保证线程间通信有效利用资源

多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个遍历的使用或操作

就是多个线程在操作同一份书时,避免对同一个共享变量的争夺,也就是我们需要通过一定的手段使各个线程能有效的利用

资源,这个手段就是等待唤醒机制

机制中用到的方法:

注意:

调用wait和notify方法需要注意的细节:

案例分析:生产者和消费者的问题

包子类

public class BaoZi {
public String pi;
public String xian;
public boolean flag =false;
}

包子铺线程:‘

public class BaoZiPu extends Thread{
private BaoZi bz; public BaoZiPu(BaoZi bz) {
this.bz = bz;
} @Override
public void run() {
int count =0; while (true){
synchronized (bz){
if (bz.flag == true){
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(count%2 ==0){
bz.pi="pi000";
bz.xian="xian0000";
}else {
bz.pi="pi111";
bz.xian="xian111";
}
count++;
System.out.println("正在做"+bz.xian+bz.pi);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
//做好包子,修改状态
bz.flag = true;
//叫醒吃饱人
bz.notify();
}
} }
}

吃包子线程

public class ChiBaoZI extends Thread{
private BaoZi bz; public ChiBaoZI(BaoZi bz){
this.bz=bz;
} @Override
public void run() {
while (true){
synchronized (bz){
if (bz.flag == false){
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} //唤醒之后
System.out.println("正在吃包子"+bz.pi+bz.xian);
//修改包子状态:
bz.flag = false;
System.out.println("吃完了");
System.out.println("+++++++++++++++++");
bz.notify();//唤醒包子铺做包子 }
}
} }

包子测试:

public class BaoZiTest {
public static void main(String[] args) {
BaoZi bz = new BaoZi();
new BaoZiPu(bz).start();
new ChiBaoZI(bz).start();
}
}

结果

正在做xian0000pi000
正在吃包子pi000xian0000
吃完了
+++++++++++++++++
正在做xian111pi111
正在吃包子pi111xian111
吃完了
+++++++++++++++++
正在做xian0000pi000
正在吃包子pi000xian0000
吃完了
+++++++++++++++++
正在做xian111pi111
正在吃包子pi111xian111
吃完了
+++++++++++++++++
正在做xian0000pi000
正在吃包子pi000xian0000
吃完了

线程池

底层原理

合理利用线程的好处

减低资源消耗,减少创建和销毁线程的次数,每个工作线程都可以被重复里哟ing,可执行多个任务

提高响应速度,当任务到达,可以不要等待线程的创建就能执行

提高线程的客观理性,可以根据系统的可承受能力,调整线程池中工作线程的数目,防止因为消耗过渡的内存,从而把服务器累吧

注意,每个线程需要大约1MB的内存,线程越多,消耗内存也越多

java中的线程池:

建立Runnable 接口的实现类

public class RunnableImpl implements Runnable{

    Lock l = new ReentrantLock();
@Override
public void run() {
System.out.println(Thread.currentThread().getName()); }
}

建立线程池并使用:

public class DemoThreadPool {
public static void main(String[] args) {
ExecutorService es =Executors.newFixedThreadPool(2);
es.submit(new RunnableImpl());
es.submit(new RunnableImpl());
es.submit(new RunnableImpl());
//线程池会一直开启,使用完线程,会自动回收到线程池,线程可以继续被使用
//一般不会销毁线程池
}
}

java-等待唤醒机制(线程中的通信)-线程池的更多相关文章

  1. 多线程之间的通信(等待唤醒机制、Lock 及其它线程的方法)

    一.多线程之间的通信. 就是多个线程在操作同一份数据, 但是操作的方法不同. 如: 对于同一个存储块,其中有两个存储位:name   sex, 现有两个线程,一个向其中存放数据,一个打印其中的数据. ...

  2. java之等待唤醒机制(线程之间的通信)

    线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同.比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消 ...

  3. 等待唤醒机制----线程池----lambda表达式

    1.等待唤醒机制 1.1线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的 ...

  4. JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

    JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...

  5. Java 之 线程 —线程通信( 等待唤醒机制)

    一.线程间通信 概念:多个线程在处理同一资源,但是处理的动作(线程的任务)却不相同. 例如: 线程 A 用来生成包子的,线程 B 用来吃包子的,包子可以理解为同一资源,线程 A 与线程 B 处理的动作 ...

  6. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  7. Java中的等待唤醒机制—至少50%的工程师还没掌握!

    这是一篇走心的填坑笔记,自学Java的几年总是在不断学习新的技术,一路走来发现自己踩坑无数,而填上的坑却屈指可数.突然发现,有时候真的不是几年工作经验的问题,有些东西即使工作十年,没有用心去学习过也不 ...

  8. java基础(27):线程安全、线程同步、等待唤醒机制

    1. 多线程 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 我们通过一个案例,演示线程 ...

  9. Java 中的等待唤醒机制透彻讲解

    线程的状态 首先了解一下什么是线程的状态,线程状态就是当线程被创建(new),并且启动(start)后,它不是一启动就进入了执行状态(run),也不是一直都处于执行状态. 这里说一下Java 的Thr ...

  10. java ->多线程_线程同步、死锁、等待唤醒机制

    线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. l  我们通过一个案例,演示线 ...

随机推荐

  1. [题解]Codeforces Round #519 - A. Elections

    [题目] A. Elections [描述] Awruk和Elodreip参加选举,n个人投票,每个人有k张票,第i个人投a[i]张票给Elodreip,投k-a[i]张票给Awruk.求最小的k,使 ...

  2. linux安装ngixn

    卸载ngxin(第一次安装请略过) 1.检查nginx是否启动,是否安装ngxin 检查是否安装nginx命令 rpm -qa|grep nginx 检查nginx是否启动命令: pa -ef|gre ...

  3. 2021年都要过去啦,你还在用Excel做数据可视化效果吗?

    2021年都要过去啦,你还在用Excel做数据可视化效果吗?古语有云,"工欲善其事,必先利其器",没有专业的工具,前期准备的再好也是白搭.现在运用数据可视化工具于经营活动中的企业是 ...

  4. 只有PC端的报表工具使用太不方便了!有没有好用的手机报表app?

    马上到年底了,签订的销售合同需尽快回款,销售经理此时正在下午出差的出租车上,通过手中的手机他查看了一下今天的回款报表 项目已经进行到了关键期,项目经理正在奔赴项目城市的高铁列车上,项目今天的进度报表已 ...

  5. Linux:mount命令出现Host is down如何解决

    当使用Linux中的mount命令挂载一个Windows的共享目录的时候有时会出现:mount error(112): Host is downRefer to the mount.cifs(8) m ...

  6. linux配置vnc server,并用vnc viewer连接server

    做过Linux运维的朋友都知道,我们一般很少直接与服务器接触.都是通过终端来连接处理一些事物. 本人常用的终端有图形界面的是vnc viewer还有命令行界面xshell,当然各有千秋,喜欢使用哪个都 ...

  7. vue项目npm run dev 报错error in ./src/main.js Module build failed: ReferenceError: Unknown plugin "transform-vue-jsx" specified in......

    问题: vue项目npm run dev运行时报错,如下图:  原因: 缺少组件 解决办法: 安装相应的组件:  npm install babel-plugin-transform-vue-jsx ...

  8. row_number()over分组排序

    row_number()over(partition by Id,Code order by setTime desc)

  9. 发现Spring事务的一个实锤bug,官方还拒不承认?你来评评理...

    你好呀,我是歪歪. 事情是这样的,上周我正在全神贯注的摸鱼,然后有个小伙伴给我发来微信消息,提出了自己关于事务的一个疑问,并配上两段代码: 先说结论:我认为这是 Spring 事务的一个 bug.但是 ...

  10. php常见的危险函数

    代码执行的危险函数 eval() 把字符串作为php代码执行 早期php一句话木马都用这个 <?php @eval($_POST['shell']);?> assert() 检查一个断言是 ...