写了一个同步的例子,但是有些问题,还请帮我看看 import java.util.Vector; public class TestSynchronized { public static void main(String[] args) { Vector<Integer> goods = new Vector<Integer>(); goods.add(-1); Consume[] c = new Consume[5]; Produce[] p = new Produce[5]; for(int i = 0; i <5;i++){ c[i] = new Consume(goods,i); p[i] = new Produce(goods,i); } for(int i = 0;i<5;i++){ c[i].run();//运行完就不动了 p[i].run();//这个地方怎么不运行了? } } } class Consume implements Runnable { private Vector<Integer> goods; private int i ; public Consume(Vector<Integer> goods,int i) { this.goods = goods; this.i = i; } public void run() { synchronized(goods) { while (true) { try { if (goods.size() == 0) goods.wait(); System.out.println("Consumer "+i+" : goods have been taken"); System.out.println("Consumer "+i+" : goods is : "+goods.get(0)); goods.clear();
上面的写乱了~重发: 写了一个同步的例子,但是有些问题,还请帮我看看 import java.util.Vector; public class TestSynchronized { public static void main(String[] args) { Vector<Integer> goods = new Vector<Integer>(); goods.add(-1); Consume[] c = new Consume[5]; Produce[] p = new Produce[5]; for(int i = 0; i <5;i++){ c[i] = new Consume(goods,i); p[i] = new Produce(goods,i); } for(int i = 0;i<5;i++){ c[i].run();//运行完就不动了 p[i].run();//这个地方怎么不运行了? } } } class Consume implements Runnable { private Vector<Integer> goods; private int i ; public Consume(Vector<Integer> goods,int i) { this.goods = goods; this.i = i; } public void run() { synchronized(goods) { while (true) { try { if (goods.size() == 0) goods.wait(); System.out.println("Consumer "+i+" : goods have been taken"); System.out.println("Consumer "+i+" : goods is : "+goods.get(0)); goods.clear();
A需要停止的时候调用B的一个方法,如close
可以考虑Context,自己写一个context类作为两个线程的变量
其实很多方法的
但我觉得你的问题在于事件通知而不是状态传递,考虑一下PropertyListener吧
import java.util.Vector;
public class TestSynchronized {
public static void main(String[] args) {
Vector<Integer> goods = new Vector<Integer>();
goods.add(-1);
Consume[] c = new Consume[5];
Produce[] p = new Produce[5];
for(int i = 0; i <5;i++){
c[i] = new Consume(goods,i);
p[i] = new Produce(goods,i);
}
for(int i = 0;i<5;i++){
c[i].run();//运行完就不动了
p[i].run();//这个地方怎么不运行了?
}
}
} class Consume implements Runnable {
private Vector<Integer> goods;
private int i ;
public Consume(Vector<Integer> goods,int i) {
this.goods = goods;
this.i = i;
}
public void run() {
synchronized(goods) {
while (true) {
try {
if (goods.size() == 0)
goods.wait();
System.out.println("Consumer "+i+" : goods have been taken");
System.out.println("Consumer "+i+" : goods is : "+goods.get(0));
goods.clear();
goods.notify();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
} 日志有问题:
Consumer 0 : goods have been taken
Consumer 0 : goods is : -1
就只有这么多?为什么 class Produce implements Runnable {
private Vector<Integer> goods;
private int j;
public Produce(Vector<Integer> goods,int j) {
this.goods = goods;
this.j = j;
}
public void run() {
int i = 0;
synchronized(goods) {
if(goods.size()!= 0){
Integer f = goods.get(0);
System.out.println("f = "+f);
}
System.out.println("product start....... "+j);
while (true) {
try {
if (goods.size() != 0)
goods.wait();
goods.add(new Integer(i));
i++;
goods.notify();
System.out.println("Producer"+j+ " : goods are ready");
Thread.sleep(500);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
写了一个同步的例子,但是有些问题,还请帮我看看
import java.util.Vector;
public class TestSynchronized {
public static void main(String[] args) {
Vector<Integer> goods = new Vector<Integer>();
goods.add(-1);
Consume[] c = new Consume[5];
Produce[] p = new Produce[5];
for(int i = 0; i <5;i++){
c[i] = new Consume(goods,i);
p[i] = new Produce(goods,i);
}
for(int i = 0;i<5;i++){
c[i].run();//运行完就不动了
p[i].run();//这个地方怎么不运行了?
}
}
} class Consume implements Runnable {
private Vector<Integer> goods;
private int i ;
public Consume(Vector<Integer> goods,int i) {
this.goods = goods;
this.i = i;
}
public void run() {
synchronized(goods) {
while (true) {
try {
if (goods.size() == 0)
goods.wait();
System.out.println("Consumer "+i+" : goods have been taken");
System.out.println("Consumer "+i+" : goods is : "+goods.get(0));
goods.clear();
goods.notify();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
} 日志有问题:
Consumer 0 : goods have been taken
Consumer 0 : goods is : -1
就只有这么多?这是怎么回事?