为什么需要线程间的通信

多个线程并发执行时,在默认情况下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());
//线程池会一直开启,使用完线程,会自动回收到线程池,线程可以继续被使用
//一般不会销毁线程池
}
}

最新文章

  1. 关于iOS热修复(HotPatch)技术的使用总结
  2. 接口测试之基于LoadRunner的一个简单示例
  3. Atitti.java android反编译解决方案-----虚拟机方案
  4. 大数据架构师基础:hadoop家族,Cloudera产品系列等各种技术
  5. Apache CXF框架结构和基本原理(转)
  6. python-集合(第二篇(七):集合)
  7. yii 删除内容时增加ajax提示
  8. Chrome下的语音控制框架MyVoix.js使用篇(一)
  9. Jetty 8.1 安装 运行 部署
  10. 小W与网格
  11. 重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口
  12. java学习笔记之集合家族1
  13. jenkins+ant+jmeter自动化环境搭建(一)
  14. python3.6 使用 pymysql 连接 Mysql 数据库及 简单的增删改查操作
  15. 帝国cms更新报错解决办法
  16. 初学习Qt的一些感悟
  17. [ios][swift]文本框UITextField用法
  18. python-day33--Process类中的方法及属性
  19. java swing:文本框添加滚动条
  20. HDU1565_方格取数(1)

热门文章

  1. C#索引器-有参属性
  2. starter
  3. 第九周shell脚本编程练习
  4. Echarts图表类型
  5. 【论文考古】量化SGD QSGD: Communication-Efficient SGD via Gradient Quantization and Encoding
  6. 论文翻译:2020_DCCRN: Deep Complex Convolution Recurrent Network for Phase-Aware Speech Enhancement
  7. 使用 Istio CNI 支持强安全 TKE Stack 集群的服务网格流量捕获
  8. Spark中的Wordcount
  9. 2022最新IntellJ IDEA诺依开发部署文档
  10. 微信小程序下拉框实现