Java 线程的通讯--生产者和消费者

java

package 生产者和消费者;

//消费者

public class Customer implements Runnable {

private Share_resources rescources=null;

public Customer( Share_resources rescources){

this.rescources=rescources;

}

public void run() {

for (int i = 0; i <50; i++) {

rescources.popup();

}

}

}

package 生产者和消费者;

//生产者

public class Producer implements Runnable{

private Share_resources rescources=null;

public Producer( Share_resources rescources){

this.rescources=rescources;

}

//共享资源对象

public void run() {

for (int i = 0; i <50; i++) {

if(i%2==0){

rescources.push("张三", "男");

}else{

rescources.push("小花", "女");

}

}

}

}

package 生产者和消费者;

//共享资源对象(姓名,性别)

public class Share_resources {

private String name;

private String gender;

private Boolean isEmpty=true;//表示共享资源是否为空状态

/**

* 生产者向共享资源对象存储数据

* @param name 存储的姓名

* @param gender 存储的性别

*/

synchronized public void push(String name,String gender){

while( ! isEmpty){//当前isEmpty为false的时候,不空等着消费者来获取

try {

this.wait();//使用同步锁调用,表示当前线程释放同步锁,进入等待池,只能被其他线程唤醒

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

//生产开始-----------------------------

this.name=name;

this.gender=gender;

//生产结束-----------------------------

isEmpty=false;//设置共享资源不能为空

this.notify();//唤醒一个消费者

}

/**

* 消费者从共享资源中取出数据

*/

synchronized public void popup(){

try {

while( isEmpty){//当前isEmpty为true的时候,不空等着生产者来生产

this.wait();

}

//消费开始------------------------------------

Thread.sleep(10);

System.out.println(this.name+"---"+this.gender);

//消费结束-------------------------------------

isEmpty=true;

this.notify();//唤醒生产者

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

package 生产者和消费者;

public class App {

public static void main(String[] args) {

//创建生产者和消费者共同的对象

Share_resources resources =new Share_resources();

//启动生产者线程

new Thread(new Producer(resources)).start();

//启动消费者线程

new Thread(new Customer(resources)).start();

}

}

 Java5生产者和消费者模式同步锁机制

package java5_同步锁机制;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

//共享资源对象(姓名,性别)

public class Share_resources {

private String name;

private String gender;

private Boolean isEmpty=true;//表示共享资源是否为空状态

private final Lock lock=new ReentrantLock();

private Condition condition =lock.newCondition();

/**

* 生产者向共享资源对象存储数据

* @param name 存储的姓名

* @param gender 存储的性别

*/

public void push(String name,String gender){

lock.lock();//获取锁

while( ! isEmpty){//当前isEmpty为false的时候,不空等着消费者来获

try {

condition.await();

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}finally {

lock.unlock();//释放锁

}

}

//生产开始-----------------------------

this.name=name;

this.gender=gender;

//生产结束-----------------------------

isEmpty=false;//设置共享资源不能为空

condition.signal();//唤醒一个消费者

}

/**

* 消费者从共享资源中取出数据

*/

public void popup(){

lock.lock();//获取锁

try {

while( isEmpty){//当前isEmpty为true的时候,不空等着生产者来生产

condition.await();

}

//消费开始------------------------------------

Thread.sleep(10);

System.out.println(this.name+"---"+this.gender);

//消费结束-------------------------------------

isEmpty=true;

condition.signal();//唤醒生产者

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally {

lock.unlock();//释放锁

}

}

}

以上是 Java 线程的通讯--生产者和消费者 的全部内容, 来源链接: utcz.com/z/392030.html

回到顶部