线程的问题-急 自己ding下先谁能给我讲清楚啊!~~~~~~~~~~~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 对的啊,是你程序的要求啊比如生产者:程序生产后就把available设置为true。就不能再生产。只能等到消费者消费了后才能再生产。比如消费者:程序消费后就把available设置为false。就不能再消费。只能等到生产者生产了后才能再消费。这样:生产-消费-生产-.......。就成了那样的结果。 但是输出不对啊Producer #1 put: 0Consumer #1 got: 0Consumer #1 got: 1应该先put啊 你下边的这段程序导致的: public synchronized int get() { while (available == false) { try { wait(); } catch (InterruptedException e) { } } available = false; notifyAll(); return contents; }在操作available 时应该进入临界区synchronized 只能保证多个线程不能操作,但单个线程就不行了 synchronized(this) { while (available == false) { try { wait(); } catch (InterruptedException e) { } } available = false; } 我觉得是两个线程时差问题。不知道对不对Producer #1 put: 0Consumer #1 got: 0Consumer #1 got: 1当第一个Cosumer消费后,Producer生产了contents变为1。在Producer打印以前,Consumer线程进入临界区,进行操作。结束后Producer接着运行打印出contents。 package test;class Producer extends Thread { private CubbyHole cubbyhole; private int number; public Producer(CubbyHole c, int number) { cubbyhole = c; this.number = number; } public void run() { for (int i = 0; i < 10; i++) { cubbyhole.put(i); try { sleep((int)(Math.random() * 100)); } catch (InterruptedException e) { } } }} class CubbyHole { private int contents; private boolean available = false; public synchronized int get() { try { if(available == false) wait(); } catch (InterruptedException e) { } available = false; System.out.println("get: " + contents); notify(); return contents; } public synchronized void put(int value) { try { if(available == true) wait(); } catch (InterruptedException e) { } contents = value; available = true; System.out.println("put: " + contents); notify(); }}class Consumer extends Thread { private CubbyHole cubbyhole; private int number; public Consumer(CubbyHole c, int number) { cubbyhole = c; this.number = number; } public void run() { int value = 0; for (int i = 0; i < 10; i++) { value = cubbyhole.get(); } }}public class ProducerConsumerTest { public static void main(String[] args) { CubbyHole c = new CubbyHole(); Producer p1 = new Producer(c, 1); Consumer c1 = new Consumer(c, 1); p1.start(); c1.start(); }}我给你改了一下,看看这个put: 0get: 0put: 1get: 1put: 2get: 2put: 3get: 3put: 4get: 4put: 5get: 5put: 6get: 6put: 7get: 7put: 8get: 8put: 9get: 9就是打印的时候cubbyhole.put(i);*****System.out.println("Producer #" + this.number+ " put: " + i);和value = cubbyhole.get();******System.out.println("Consumer #" + this.number+ " got: " + value);这两个在*****的地方切换了进程 求看下我这个程序怎不不显示,所画的图呢 用JAVA写出了一个杨辉三角。。可是怎么打印出来的只有一列呢,求指教 求教关于java的for循环问题 笔试题目java算法求解 N年没有来提问了,一提就是一鼠标,鼠标事件求解!!! 关于异常 高手指点,路径问题(急) int intin = System.in.read(b);怎么来计算intin的值? 当StringBuffer碰到Socket,我出错了,菜鸟求教 学java最重要的是掌握什么? Tomcat的work文件夹下的文件夹删除问题 关于java web系统的用户登录,密码验证的问题。。。
比如生产者:程序生产后就把available设置为true。就不能再生产。只能等到消费者消费了后才能再生产。
比如消费者:程序消费后就把available设置为false。就不能再消费。只能等到生产者生产了后才能再消费。
这样:生产-消费-生产-.......。就成了那样的结果。
Producer #1 put: 0
Consumer #1 got: 0
Consumer #1 got: 1
应该先put啊
public synchronized int get() {
while (available == false) {
try {
wait();
} catch (InterruptedException e) { }
}
available = false;
notifyAll();
return contents;
}
在操作available 时应该进入临界区
synchronized 只能保证多个线程不能操作,但单个线程就不行了 synchronized(this) {
while (available == false) {
try {
wait();
} catch (InterruptedException e) { }
}
available = false;
}
Producer #1 put: 0
Consumer #1 got: 0
Consumer #1 got: 1
当第一个Cosumer消费后,Producer生产了contents变为1。在Producer打印以前,Consumer线程
进入临界区,进行操作。结束后Producer接着运行打印出contents。
private CubbyHole cubbyhole;
private int number; public Producer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
} public void run() {
for (int i = 0; i < 10; i++) {
cubbyhole.put(i);
try {
sleep((int)(Math.random() * 100));
} catch (InterruptedException e) { }
}
}
} class CubbyHole {
private int contents;
private boolean available = false; public synchronized int get() {
try {
if(available == false) wait();
} catch (InterruptedException e) { }
available = false;
System.out.println("get: " + contents);
notify();
return contents;
} public synchronized void put(int value) {
try {
if(available == true) wait();
} catch (InterruptedException e) { }
contents = value;
available = true;
System.out.println("put: " + contents);
notify();
}
}class Consumer extends Thread {
private CubbyHole cubbyhole;
private int number; public Consumer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
} public void run() {
int value = 0;
for (int i = 0; i < 10; i++) {
value = cubbyhole.get(); }
}
}public class ProducerConsumerTest {
public static void main(String[] args) {
CubbyHole c = new CubbyHole();
Producer p1 = new Producer(c, 1);
Consumer c1 = new Consumer(c, 1); p1.start();
c1.start();
}
}我给你改了一下,看看这个
put: 0
get: 0
put: 1
get: 1
put: 2
get: 2
put: 3
get: 3
put: 4
get: 4
put: 5
get: 5
put: 6
get: 6
put: 7
get: 7
put: 8
get: 8
put: 9
get: 9
就是打印的时候
cubbyhole.put(i);
*****
System.out.println("Producer #" + this.number+ " put: " + i);
和
value = cubbyhole.get();
******
System.out.println("Consumer #" + this.number+ " got: " + value);
这两个在*****的地方切换了进程