黑马程序员技术交流社区
标题:
多线程问题
[打印本页]
作者:
焦健
时间:
2012-12-25 13:58
标题:
多线程问题
本帖最后由 焦健 于 2012-12-27 14:22 编辑
关于我上次提出的多线程生产者消费者问题,实现生产和消费对应起来,0生产0消费,1生产1消费,
今天想想终于做出来了,请大家看看有没有什么不完善的地方
/*多线程执行
*多个生产者消费者同时执行。
*每个上产者生产一个由对应序号的消费者进行消费。
*实现一个生产者对应一个消费者的目的,即00一组,11一组等。
* */
package cn.start;
class Res3 {
private String name;
private int count=0;
private boolean b=false;
private int x1=0,x2=0;
public void set(String name){
this.name=name+count;
count++;
System.out.println(Thread.currentThread().getName()+"——生产---"+this.name);
b=true;
notifyAll();
}
public void get(){
System.out.println(Thread.currentThread().getName()+"——消费者---"+this.name);
b=false;
notifyAll();
}
//show1方法的参数是可以运行的线程序号
public synchronized void show1(int x){
//判断线程的名字和位置顺序是否对应,
if(Thread.currentThread().getName().endsWith(""+x)&&(x==x1)){
if(b)
try{wait();}catch(Exception e){}
set("烤鸭");
x1++;
if(x1>5)//改变条件值,使它一直循环下去
x1=0;
}
}
//show1方法的参数是可以运行的线程序号
public synchronized void show2(int x){
//判断线程的名字和位置顺序是否对应,
if(Thread.currentThread().getName().endsWith(""+x)&& (x==x2)){
if(!b)
try{wait();}catch(Exception e){}
get();
x2++;
if(x2>5)//改变条件值,使它一直循环下去
x2=0;
}
}
}
class Shengc implements Runnable{
Res3 r;
public Shengc(Res3 r) {
super();
this.r = r;
}
public void run(){
while(true){
//启动多个show2方法,用for循环实现。
for(int y=0;y<=5;y++){
r.show1(y);
if(y==5)//改变循环条件值,使show2方法能够一直被调用。
y=-1;
}
}
}
}
class Xiaof implements Runnable{
Res3 r;
public Xiaof(Res3 r) {
super();
this.r = r;
}
public void run(){
while(true){
//启动多个show2方法,用for循环实现。
for(int y=0;y<=5;y++){
r.show2(y);
if(y==5)//改变循环条件值,使show2方法能够一直被调用。
y=-1;
}
}
}
}
public class Duo7 {
public static void main(String[] args) {
Res3 r=new Res3();
//创建多条线程,线程名字结尾有序号x
for(int x=0;x<=5;x++){
new Thread(new Shengc(r),"生产商--"+x).start();
new Thread(new Xiaof(r),"消费者--"+x).start();
}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2