黑马程序员技术交流社区
标题:
多线程的问题求大神进来解读
[打印本页]
作者:
丁岩
时间:
2012-10-15 08:53
标题:
多线程的问题求大神进来解读
本帖最后由 丁岩 于 2012-10-15 08:56 编辑
package Packs;
import java.io.IOException;
import java.util.*;
public class SR
{
public static void main(String[]args) throws IOException
{
ArrayList<Goods> al=new ArrayList<Goods>();
Room r=new Room(100,al);//库存上限
Producer pd=new Producer(al,r);//生产者
Customer ct=new Customer(al,r);//消费者
//输入货物
Thread t1=new Thread(pd); //创建生产者进程
Thread t2=new Thread(ct);//创建消费者进程1
Thread t3=new Thread(ct);//创建消费者进程2
t1.start();
t2.start();
t3.start();
//打印货物
}
}
class Customer implements Runnable
{
private ArrayList<Goods>al=null;
private Room r;
public Customer(ArrayList<Goods>al,Room r)
{
this.r=r;
this.al=al;
}
public void run()
{
synchronized(r)
{
if(!(r.flag))
{
try {
r.wait();
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("\n取货员来了!!!");
Random rm=new Random();
while(!al.isEmpty())//假如集合不空的话,我就随机打印,然后移除打印对象
{
int m=rm.nextInt(al.size());
if(al.get(m)!=null)
{
System.out.println(Thread.currentThread().getName()+"——"+al.get(m).name+"\t"+al.get(m).price+"元");
Thread.yield();
al.remove(m);
}
}
r.flag=false;
r.notify();
}
}
}
class Producer implements Runnable
{
ArrayList<Goods> al=null;
Room r=null;
Producer(ArrayList<Goods> al,Room r)
{
this.al=al;
this.r=r;
}
public void Input() throws IOException//手动输入的部分,但是便于测试没有启动
{
System.out.println("请存入商品的名称和价格以空格分隔,回车确认");
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
int num=0;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
{
break;
}
String[] msg=line.split(" ");
if(num<=r.max-1)
{
try
{
al.add(new Goods(msg[0],new Float(msg[1])));
}
catch(Exception e)
{
System.out.println("存在非法输入");
}
num++;
}
}
}
public void produce()//产生随机对象,存入集合
{
System.out.println("自动存入货物");
Random rm=new Random();
while(al.size()!=r.max)
{
int m=rm.nextInt(100);
int n=rm.nextInt(100);
al.add(new Goods(String.valueOf(m),new Float(n)));
}
}
public void run()
{
synchronized(r)
{
if(r.flag)
{
try {
r.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//Input();
produce();
if(r.isFull())
System.out.println("仓库已满不能存货");
r.showGoods();
r.flag=true;
r.notifyAll();
}
}
}
class Room
{
public int max;
private ArrayList<Goods>al=null;
public boolean flag;
public Room(int max,ArrayList<Goods>al)
{
this.max=max;
this.al=al;
flag=false;
}
public boolean isFull()
{
flag=false;
if(al.size()==max)
flag=true;
return flag;
}
public void showGoods()
{
int num=1;
if(!al.isEmpty())
{
System.out.println("已存入货物");
System.out.println("编号\t名称\t价格");
}
Iterator it=al.iterator();
while(it.hasNext())
{
Object obj=it.next();
Goods p=(Goods)obj;
System.out.println("("+num+")\t"+p.name+"\t"+p.price+"元");
num++;
}
}
}
class Goods
{
public String name;
public float price;
public Goods(String name,float price )
{
this.name=name;
this.price=price;
}
public Goods()
{
}
}
复制代码
运行结果是:
自动存入货物
仓库已满不能存货
已存入货物
编号 名称 价格
(1) 23 9.0元
(2) 45 19.0元
(3) 37 46.0元
(4) 75 9.0元
(5) 77 90.0元
(6) 19 35.0元
(7) 41 66.0元
(8) 87 8.0元
(9) 38 11.0元
(10) 58 88.0元
(11) 51 52.0元
(12) 97 67.0元
(13) 91 73.0元
(14) 24 7.0元
(15) 83 25.0元
(16) 35 24.0元
(17) 86 70.0元
(18) 55 46.0元
(19) 58 86.0元
(20) 37 31.0元
(21) 28 34.0元
(22) 38 8.0元
(23) 74 97.0元
(24) 52 65.0元
(25) 85 74.0元
(26) 41 32.0元
(27) 23 60.0元
(28) 22 81.0元
(29) 52 32.0元
(30) 83 25.0元
(31) 42 74.0元
(32) 54 11.0元
(33) 42 81.0元
(34) 53 48.0元
(35) 50 95.0元
(36) 46 83.0元
(37) 0 80.0元
(38) 6 96.0元
(39) 69 0.0元
(40) 33 78.0元
(41) 35 53.0元
(42) 58 88.0元
(43) 0 44.0元
(44) 95 73.0元
(45) 37 99.0元
(46) 97 44.0元
(47) 88 44.0元
(48) 26 95.0元
(49) 7 21.0元
(50) 14 24.0元
(51) 14 46.0元
(52) 92 63.0元
(53) 51 89.0元
(54) 38 11.0元
(55) 16 45.0元
(56) 10 67.0元
(57) 89 11.0元
(58) 33 21.0元
(59) 12 8.0元
(60) 4 61.0元
(61) 43 35.0元
(62) 77 73.0元
(63) 61 14.0元
(64) 19 70.0元
(65) 70 62.0元
(66) 63 91.0元
(67) 66 28.0元
(68) 73 45.0元
(69) 72 48.0元
(70) 51 66.0元
(71) 36 86.0元
(72) 45 44.0元
(73) 66 36.0元
(74) 33 27.0元
(75) 65 87.0元
(76) 73 99.0元
(77) 45 22.0元
(78) 52 95.0元
(79) 93 45.0元
(80) 81 6.0元
(81) 50 76.0元
(82) 0 60.0元
(83) 81 50.0元
(84) 84 35.0元
(85) 44 10.0元
(86) 57 97.0元
(87) 33 20.0元
(88) 79 33.0元
(89) 62 97.0元
(90) 23 29.0元
(91) 49 70.0元
(92) 35 94.0元
(93) 79 62.0元
(94) 61 39.0元
(95) 44 97.0元
(96) 9 69.0元
(97) 64 84.0元
(98) 52 4.0元
(99) 57 15.0元
(100) 29 64.0元
取货员来了!!!
Thread-2——46 83.0元
Thread-2——12 8.0元
Thread-2——52 4.0元
Thread-2——77 90.0元
Thread-2——95 73.0元
Thread-2——84 35.0元
Thread-2——49 70.0元
Thread-2——33 20.0元
Thread-2——36 86.0元
Thread-2——33 78.0元
Thread-2——73 45.0元
Thread-2——7 21.0元
Thread-2——42 81.0元
Thread-2——35 24.0元
Thread-2——79 62.0元
Thread-2——45 19.0元
Thread-2——97 67.0元
Thread-2——52 95.0元
Thread-2——9 69.0元
Thread-2——57 15.0元
Thread-2——42 74.0元
Thread-2——19 70.0元
Thread-2——62 97.0元
Thread-2——44 97.0元
Thread-2——38 11.0元
Thread-2——79 33.0元
Thread-2——92 63.0元
Thread-2——57 97.0元
Thread-2——0 60.0元
Thread-2——83 25.0元
Thread-2——89 11.0元
Thread-2——81 6.0元
Thread-2——35 94.0元
Thread-2——35 53.0元
Thread-2——51 52.0元
Thread-2——54 11.0元
Thread-2——53 48.0元
Thread-2——4 61.0元
Thread-2——22 81.0元
Thread-2——23 60.0元
Thread-2——77 73.0元
Thread-2——29 64.0元
Thread-2——37 31.0元
Thread-2——65 87.0元
Thread-2——50 95.0元
Thread-2——91 73.0元
Thread-2——28 34.0元
Thread-2——64 84.0元
Thread-2——45 22.0元
Thread-2——51 66.0元
Thread-2——44 10.0元
Thread-2——0 80.0元
Thread-2——69 0.0元
Thread-2——81 50.0元
Thread-2——58 86.0元
Thread-2——55 46.0元
Thread-2——83 25.0元
Thread-2——23 9.0元
Thread-2——43 35.0元
Thread-2——58 88.0元
Thread-2——97 44.0元
Thread-2——19 35.0元
Thread-2——45 44.0元
Thread-2——38 8.0元
Thread-2——85 74.0元
Thread-2——50 76.0元
Thread-2——93 45.0元
Thread-2——66 28.0元
Thread-2——26 95.0元
Thread-2——61 14.0元
Thread-2——33 27.0元
Thread-2——41 66.0元
Thread-2——52 65.0元
Thread-2——6 96.0元
Thread-2——88 44.0元
Thread-2——16 45.0元
Thread-2——58 88.0元
Thread-2——74 97.0元
Thread-2——51 89.0元
Thread-2——37 99.0元
Thread-2——14 46.0元
Thread-2——86 70.0元
Thread-2——66 36.0元
Thread-2——63 91.0元
Thread-2——72 48.0元
Thread-2——70 62.0元
Thread-2——52 32.0元
Thread-2——75 9.0元
Thread-2——41 32.0元
Thread-2——23 29.0元
Thread-2——73 99.0元
Thread-2——61 39.0元
Thread-2——14 24.0元
Thread-2——0 44.0元
Thread-2——10 67.0元
Thread-2——37 46.0元
Thread-2——87 8.0元
Thread-2——24 7.0元
Thread-2——33 21.0元
Thread-2——38 11.0元
但是明明我Custmoe线程做了两个,为什么只有Thread2再输出啊,Thread1哪去了,怎么把他弄成Thread 1,2交替的样子啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2