标签:Thread clerk 通信 线程 void public wait
package com.www.java3;
/**
* 线程通信例子:使用两个线程交替打印1-100
* 三个方法:
* 1.wait():一旦执行此方法,线程进入阻塞状态,并释放同步监视器
* 2.notify():一旦执行此方法,唤醒被wait阻塞的一个线程,如果有多个线程被wait,则唤醒优先级最高的那个
* 3.notifyAll():唤醒所有被wait阻塞的线程
*
* 说明:
* 1.wait()、notify()、notifyAll()只能出现在同步代码块,同步方法中(lock不行)
* 2.三个方法的调用者必须是同步代码块或者同步方法中的同步监视器
* 3.三个方法定义在Object类中
* @author www
* @creat 2022-{MONTH}-{DAY}
*/
class Number implements Runnable{
private int num = 1;
@Override
public void run() {
while(true){
synchronized (this) {
notify();
if(num <= 100){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + num);
num++;
try {
//使调用wait()方法的线程进入阻塞状态
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else break;
}
}
}
}
public class CommunicationTest {
public static void main(String[] args) {
Number number = new Number();
Thread t1 = new Thread(number);
Thread t2 = new Thread(number);
t1.setName("线程一");
t2.setName("线程二");
t1.start();
t2.start();
}
}
package com.www.java3;
/**
*
* @author www
* @creat 2022-{MONTH}-{DAY}
*/
class Clerk{
private int productCount = 0;
public synchronized void produceProduct() {
if(productCount < 20){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
productCount++;
System.out.println(Thread.currentThread().getName() + "开始生产第" + productCount + "个产品");
notify();
}else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void consumeProduct() {
if(productCount > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "开始消费第" + productCount + "个产品");
productCount--;
notify();
}else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Productor extends Thread{
private Clerk clerk;
public Productor(Clerk clerk){
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(getName() + "开始生产产品");
while (true){
clerk.produceProduct();
}
}
}
class Customer extends Thread{
private Clerk clerk;
public Customer(Clerk clerk){
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(getName() + "开始消费产品");
while (true){
clerk.consumeProduct();
}
}
}
public class ProductTest {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Productor p1 = new Productor(clerk);
Customer c1 = new Customer(clerk);
p1.setName("生产者1");
c1.setName("消费者1");
p1.start();
c1.start();
}
}
标签:Thread,clerk,通信,线程,void,public,wait 来源: https://blog.csdn.net/qq_41571545/article/details/123186582
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。