黑马程序员技术交流社区
标题:
生产消费者模式问题
[打印本页]
作者:
lwy0319
时间:
2014-4-3 04:40
标题:
生产消费者模式问题
本帖最后由 lwy0319 于 2014-4-3 04:43 编辑
试着根据交通灯系统先写一个路口车辆刷新的小样,但是计数器总是隔两个,求解
import java.util.*;
class Road{
public List<String> road=new ArrayList<String>();
}
class Addcar implements Runnable{
Road r;
Addcar(Road r){
this.r=r;
}
public void run(){
for(int i=1;i<100;i++){
synchronized(r){
if(r.road.size()==0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
r.road.add("car"+i);
System.out.println(r.road.get(0)+"驶入");
}else{
try {
r.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
r.notify();
}
}
}
}
class Removecar implements Runnable{
Road r;
Removecar(Road r){
this.r=r;
}
public void run() {
for(int i=1;i<100;i++){
synchronized(r){
if(r.road.size()!=0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(r.road.get(0)+"驶出");
r.road.remove(r.road.get(0));
}else{
try {
r.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
r.notify();
}
}
}
}
public class ThreadDemo1 {
public static void main(String[] args){
Road r=new Road();
Addcar writer=new Addcar(r);
Removecar reader=new Removecar(r);
new Thread(writer).start();
new Thread(reader).start();
}
}
复制代码
是因为它每轮都要等待一次,但是这个时候i++了么?如果较真的话有没有办法优化这个问题?虽然如果不计数的话我的目的也算达到一部分了
作者:
林发明
时间:
2014-4-6 10:32
run方法中的for循环换成while循环,i++ 放在 r.road.add("car"+i);后面。类似下面的
public void run(){
//for(int i=1;i<100;i++)
int i = 1;
while(i<100)
{
synchronized(r){
if(r.road.size()==0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
r.road.add("car"+i);
i++;
System.out.println(r.road.get(0)+"驶入");
}
else{
try {
r.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
r.notify();
}
//System.out.println(i);
}
}
复制代码
分析一下你原来的程序:
假如执行过程如下:
第一步:执行addCar线程,此时i=1,执行完整个for循环一次后 ,i会自增一,这时不满足条件,会执行wait,addCar线程停止在这。
接着执行removeCar 取出一辆车,这时会notify,notify会唤醒addCar线程,(关键就在这 ,它会从addCar线程停止的地方继续执行,执行完后,for循环会又执行一次,这时i++后,i=3,然后在增加一辆车,这时车的编号就是3了,而不是2)
作者:
lwy0319
时间:
2014-4-6 11:07
林发明 发表于 2014-4-6 10:32
run方法中的for循环换成while循环,i++ 放在 r.road.add("car"+i);后面。类似下面的
原来如此,谢谢你,受教了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2