黑马程序员技术交流社区
标题:
关于多线程部分生产者消费者问题
[打印本页]
作者:
姬光普
时间:
2015-5-21 23:19
标题:
关于多线程部分生产者消费者问题
看完视频后总结,
第一种方法
package org.heima1;
public class Test7 {
/**
* 生产者消费者问题
*/
public static void main(String[] args) {
Resource r=new Resource();
productor p=new productor(r);
consumer c=new consumer(r);
Thread t1=new Thread(p);
Thread t2=new Thread(p);
Thread t3=new Thread(c);
Thread t4=new Thread(c);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Resource{
private String name;
private int count=0;
private Boolean flag=false;
public synchronized void set(String name){
while(flag){ //必须用while循环判断,如果用if,就会出现极端情况
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.name=name+"----"+count++;
System.out.println(Thread.currentThread().getName()+"。。。生产者。。。"+this.name);
flag=true;
notifyAll();//必须用notifyAll,防止只唤醒自己的线程
}
public synchronized void out(){
while(!flag){ //必须用while循环判断,如果用if,就会出现极端情况
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"。消费者。。"+this.name);
flag=false;
notifyAll();//必须用notifyAll,防止只唤醒自己的线程
}
}
class productor implements Runnable{
private Resource r;
productor(Resource r){
this.r=r;
}
public void run(){
while(true){
r.set("商品");
}
}
}
class consumer implements Runnable{
private Resource r;
consumer(Resource r){
this.r=r;
}
public void run(){
while(true){
r.out();
}
}
}
复制代码
第二种方法解决
package org.heima1;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test8{
/**
* 生产者消费者问题,利用Lock解决
*/
public static void main(String[] args) {
Resource1 r=new Resource1();
productor1 p=new productor1(r);
consumer1 c=new consumer1(r);
Thread t1=new Thread(p);
Thread t2=new Thread(p);
Thread t3=new Thread(c);
Thread t4=new Thread(c);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Resource1{
private String name;
private int count=0;
private Boolean flag=false;
private Lock lock=new ReentrantLock();
private Condition con1=lock.newCondition();
private Condition con2=lock.newCondition();
public void set(String name){
lock.lock();
try {
while(flag){ //必须用while循环判断,如果用if,就会出现极端情况
try {
con1.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.name=name+"----"+count++;
System.out.println(Thread.currentThread().getName()+"。。。生产者。。。"+this.name);
flag=true;
con2.signal();//唤醒对方的一个线程
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}
}
public void out(){
lock.lock();
try {
while(!flag){ //必须用while循环判断,如果用if,就会出现极端情况
try {
con2.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"。消费者。。"+this.name);
flag=false;
con1.signal();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}
}
}
class productor1 implements Runnable{
private Resource1 r;
productor1(Resource1 r){
this.r=r;
}
public void run(){
while(true){
r.set("商品");
}
}
}
class consumer1 implements Runnable{
private Resource1 r;
consumer1(Resource1 r){
this.r=r;
}
public void run(){
while(true){
r.out();
}
}
}
复制代码
作者:
菜鸟的求学路
时间:
2015-5-22 00:11
哦 这代码写的 哪个多啊 绝对牛掰 虽然我现在还看不懂
作者:
姬光普
时间:
2015-5-22 00:19
菜鸟的求学路 发表于 2015-5-22 00:11
哦 这代码写的 哪个多啊 绝对牛掰 虽然我现在还看不懂
:'(这是基础视频上教的代码,只是感觉很好,就顺道敲下来了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2