首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

Java的多线程有关问题

2012-03-27 
Java的多线程问题直接上源码:Java codepackage com.workclass Resource{int Goods0boolean choosefals

Java的多线程问题
直接上源码:

Java code
package com.work;class Resource{     int Goods=0;     boolean choose=false;}class Consumer implements Runnable{  //消费者    Resource r;    public Consumer(Resource r){        this.r=r;    }    public void run() {       synchronized (r) {        while (true) {            if (r.choose==true) {                r.Goods--;                r.choose=false;                System.out.println("消费了"+r.Goods);            }         }      }            }  }class Producer implements Runnable{  //生产者    Resource r;    public Producer(Resource r){        this.r=r;    }    public void run() {         synchronized (r) {            while (true) {                if (r.choose==false) {                    r.Goods++;  //1                    r.choose=true;                    System.out.println("生产了"+r.Goods);                }            }              }                }       }public class Sample {        public static void main(String[] args) {       Resource r=new Resource();       Consumer con=new Consumer(r);       Producer pro=new Producer(r);       Thread b=new Thread(pro);       b.start();       Thread a=new Thread(con);       a.start();     }}


现象:
只答应了 生产了1,然后线程停在哪?

求解释,谢谢各位!!!

[解决办法]
Java code
         synchronized (r) {            while (true) {                if (r.choose==false) {                    r.Goods++;  //1                    r.choose=true;                    System.out.println("生产了"+r.Goods);                }            }              }
[解决办法]
Java code
class Resource {    int Goods = 0;    boolean choose = false;}class Consumer implements Runnable { // 消费者    Resource r;    public Consumer(Resource r) {        this.r = r;    }    public void run() {        while (true) {            synchronized (r) {                if (r.choose == true) {                    r.choose = false;                    System.out.println("消费了" + r.Goods--);                }            }        }    }}class Producer implements Runnable { // 生产者    Resource r;    public Producer(Resource r) {        this.r = r;    }    public void run() {        while (true) {            synchronized (r) {                if (r.choose == false) {                    r.Goods++; // 1                    r.choose = true;                    System.out.println("生产了" + r.Goods);                }            }        }    }}public class Sample {    public static void main(String[] args) {        Resource r = new Resource();        Consumer con = new Consumer(r);        Producer pro = new Producer(r);        Thread b = new Thread(pro);        b.start();        Thread a = new Thread(con);        a.start();    }}
[解决办法]
我觉得不会. 执行完后还要回来执行的. 只有同步块的程序执行完,才释放锁.
[解决办法]
class Resource{
int Goods=0;
boolean choose=false;
}
class Consumer implements Runnable{ //消费者
Resource r;
public Consumer(Resource r){
this.r=r;
}
public void run() {
while (true) {
synchronized (r) {
if (r.choose==true) {
r.Goods--;
r.choose=false;
System.out.println("消费了"+r.Goods);
}
}
}
}
 }
class Producer implements Runnable{ //生产者
Resource r;
public Producer(Resource r){
this.r=r;


}
public void run() {
while (true) {
synchronized (r) {
if (r.choose==false) {
r.Goods++; //1
r.choose=true;
System.out.println("生产了"+r.Goods);
}
}
}
}
}
把这两行对调以下位置就好了,你应该是想在操作Resource的时候互斥,可你把死循环也放在同步块里面,线程根本就跳不出去抢用资源,所以就出现你这种情况了

热点排行
Bad Request.