线程通讯笔记:

/** 线程通信 三个方法:
* wait(): 调用该方法 是该调用的方法的线程释放共享资源的锁,进入等待状态,直至被唤醒
* notify() : 可以唤醒队列中的第一个等待同一共享资源的线程, 并使该线程退出等待队列,进入可运行状态
* notifyALL() : 全部唤醒,优先级最高的先执行!!!
* ---------------------------------------------------------------
* 例一: 使用两个线程 打印1-100,线程,两个线程交替打印
* ***方法: 一个线程先打印,打印完毕,先notifyALL,再接着 wait();
*
*/

线程交替数数代码:

class PrintNum2 implements Runnable{
int num=1;
@Override
public void run() {
while(num<=30){ synchronized (this) {
if(num<=30){
System.out.println(Thread.currentThread().getName()+" : "+num);
num++;
}
else{
break;
}
notifyAll();
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
}
}
public class TestComm {
public static void main(String[] args) {
PrintNum2 p=new PrintNum2();
Thread t1=new Thread(p);
Thread t2=new Thread(p); t1.start();
t2.start();
}
}

交替数数的测试结果:

Thread-0 : 1
Thread-1 : 2
Thread-0 : 3
Thread-1 : 4
Thread-0 : 5
Thread-1 : 6
Thread-0 : 7
Thread-1 : 8
Thread-0 : 9
Thread-1 : 10
Thread-0 : 11
Thread-1 : 12
Thread-0 : 13
Thread-1 : 14
Thread-0 : 15
Thread-1 : 16
Thread-0 : 17
Thread-1 : 18
Thread-0 : 19
Thread-1 : 20
Thread-0 : 21
Thread-1 : 22
Thread-0 : 23
Thread-1 : 24
Thread-0 : 25
Thread-1 : 26
Thread-0 : 27
Thread-1 : 28
Thread-0 : 29
Thread-1 : 30

 生产者&消费者线程问题:

/** 生产者/消费者 问题
* 1.生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品
* 2.店员一次只能持有固定数量的产品(比如:20),
* 3.如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产
* 4.如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。
* ----------------------------------
* 分析:
* 1.是否涉及多线程的同步问题!
* 2.谁是共享数据!谁是共享代码块!
*/

问题模型内容:

代码演示: (每个消费者和生产者生产或者消费的产品个数都不超过10个 ,为了方便起见!太多的话, 输出结果太长了2333)

 class Clerk{  //店员
int product;
public synchronized void addProduct() { //生产产品
if(product>=20)
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
else{
product++;
System.out.println(Thread.currentThread().getName()+" 生产了 "+product+"个产品!");
notifyAll();
}
}
public synchronized void consumeProduct(){
if(product<=0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else{
System.out.println(Thread.currentThread().getName()+" 消费了第 "+product+"个产品!");
product--;
notifyAll();
}
}
}
class Productor implements Runnable{ //生产者 类
Clerk clerk;
int num;
public Productor(Clerk clerk) {
this.clerk = clerk;
this.num=0;
}
public void run() {
System.out.println("生产者开始生产产品!!");
while (this.num<10){
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
num++;
clerk.addProduct();
}
}
} class Consumer implements Runnable{
Clerk clerk;
int num;
public Consumer(Clerk clerk) {
this.clerk = clerk;
this.num=0;
}
public void run(){
System.out.println("消费者消费产品!");
while (this.num<10){
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
num++;
clerk.consumeProduct();
}
}
} public class Productor_Customer {
public static void main(String[] args) {
Clerk clerk=new Clerk();
Productor p1=new Productor(clerk);
Consumer c1=new Consumer(clerk); Thread t1=new Thread(p1," 生产者1 线程 ");
Thread t3=new Thread(p1," 生产者2 线程 ");
Thread t2=new Thread(c1," 消费者线程 ");
t1.start();
t2.start();
t3.start();
}
}

结果输出:

生产者开始生产产品!!
生产者开始生产产品!!
消费者消费产品!
生产者2 线程 生产了 1个产品!
生产者1 线程 生产了 2个产品!
生产者2 线程 生产了 3个产品!
消费者线程 消费了第 3个产品!
生产者1 线程 生产了 3个产品!
消费者线程 消费了第 3个产品!
生产者2 线程 生产了 3个产品!
生产者1 线程 生产了 4个产品!
消费者线程 消费了第 4个产品!
生产者2 线程 生产了 4个产品!
生产者1 线程 生产了 5个产品!
消费者线程 消费了第 5个产品!
生产者1 线程 生产了 5个产品!
生产者2 线程 生产了 6个产品!
生产者1 线程 生产了 7个产品!
消费者线程 消费了第 7个产品!
生产者2 线程 生产了 7个产品!
消费者线程 消费了第 7个产品!
消费者线程 消费了第 6个产品!
消费者线程 消费了第 5个产品!
消费者线程 消费了第 4个产品!

Java基础 线程的通信的三个方法/ 交替数数线程 / 生产者&消费者线程问题的更多相关文章

  1. Java中获取键盘输入值的三种方法

    Java中获取键盘输入值的三种方法     Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...

  2. 使用Win32 API实现生产者消费者线程同步

    使用win32 API创建线程,创建信号量用于线程的同步 创建信号量 语法例如以下 HANDLE semophore; semophore = CreateSemaphore(lpSemaphoreA ...

  3. Java多线程初学者指南(7):向线程传递数据的三种方法

    在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果.但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别.由于线程 ...

  4. 线程间通信的三种方式(NSThread,GCD,NSOperation)

    一.NSThread线程间通信 #import "ViewController.h" @interface ViewController ()<UIScrollViewDel ...

  5. Java多线程:向线程传递参数的三种方法

    在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果.但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别.由于线程 ...

  6. java基础篇---I/O技术(三)

    接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...

  7. Java基础加强之并发(三)Thread中start()和run()的区别

    Thread中start()和run()的区别 start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法.start()不能被重复调用.run()   : run()就和普通的成 ...

  8. VC 线程间通信的三种方式

    1.使用全局变量(窗体不适用)     实现线程间通信的方法有很多,常用的主要是通过全局变量.自定义消息和事件对象等来实现的.其中又以对全局变量的使用最为简洁.该方法将全局变量作为线程监视的对象,并通 ...

  9. 【转】VC 线程间通信的三种方式

    原文网址:http://my.oschina.net/laopiao/blog/94728 1.使用全局变量(窗体不适用)      实现线程间通信的方法有很多,常用的主要是通过全局变量.自定义消息和 ...

随机推荐

  1. JAVA数据结构和算法 1-综述:数据结构和数据类型

    数据结构:指数据在计算机内存空间中或者磁盘中的组织形式. 对于数据结构的操作:插入.删除.查找.迭代遍历.排序等: Java.util包中含有诸如向量(一个可扩充的数组).栈.哈希表等类型的数据结构, ...

  2. python中通过客户端IP拿到所在城市和当地天气信息—附带项目案例

    熟悉老一代QQ的小伙伴可能都知道,很早以前的QQ,鼠标滑到头像的位置,你的位置和IP会在详情页显示,那么这个是如何做到的呢?下面我们就来玩一玩这个东西 首先,需求分析: 1.拿到客户端IP 2.通过I ...

  3. Python中最常见的10个问题(列表)

    列表是Python中使用最多的一种数据结果,如何高效操作列表是提高代码运行效率的关键,这篇文章列出了10个常用的列表操作,希望对你有帮助. 1.迭代列表时如何访问列表下标索引 普通版: items = ...

  4. vue 强制刷新组件重新渲染

    实现功能:使用富文本编辑器编写文章,然后把编写成功的文章用子组件显示. 问题描述:父组件给子组件传递数据,子组件第一次调用数据的时候页面渲染是正常的,当数据变化的时候,子组件的页面渲染就失效了. 问题 ...

  5. Mac10.14.6安装Python3

    换了台新电脑, 记录一下Python3的安装过程. 1.检查现有版本的python. 因为Mac的系统以来python2, 所以python肯定是有的, 因为依赖, 所以安装了python3, 也不可 ...

  6. vue element-ui typescript tree报错 === Property 'getCheckedNodes' does not exist on type 'Element | Element[] | Vue | Vue[]'.

    import { Tree } from 'element-ui' const ref = <Tree>this.$refs.tree ref.getCheckedNodes()

  7. springboot集成elk 一: springboot + Elasticsearch

    1.ELK介绍 1> Elasticsearch是实时全文搜索和分析引擎, 提供搜集.分析.存储数据三大功能: 是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统. ...

  8. oracle管道函数的用法(一行拆为多行)

    oracle管道函数是一类特殊的函数,oracle管道函数返回值类型必须为集合 如果需要在客户端实时的输出函数执行过程中的一些信息,在oracle9i以后可以使用管道函数(pipeline funct ...

  9. JAVA MAC 比较大小

    2个MAC String mac_1="AAAAAAAAAAAA"; String mac_1="AAAAAAAAAAAB"; 方法一: int a = 0; ...

  10. 初始STM32

    主要内容: 1.什么是STM32 STM32有什么 STM32怎么选型号 一:什么是STM32 ST— 意法半寻体,是一个公司名,即SOC厂商(ARM是IP厂商,STM32中内核由ARM设计,外设例如 ...