直接上源码: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,然后线程停在哪?求解释,谢谢各位!!!
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,然后线程停在哪?求解释,谢谢各位!!!
while (true) {
if (r.choose==false) {
r.Goods++; //1
r.choose=true;
System.out.println("生产了"+r.Goods);
}
}
} 线程停在这了,这个while(true) 循环一直进行下去。
原因是这段程序在同步块中,消费线程永远都不会执行。(因为同步锁一直不释放)。你可以把同步块标在while里面。象这样: while (true)
{
synchronized (r)
{
if (r.choose==false)
{
r.Goods++; //1
r.choose=true;
System.out.println("生产了"+r.Goods);
}
}
}
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();
}
}
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的时候互斥,可你把死循环也放在同步块里面,线程根本就跳不出去抢用资源,所以就出现你这种情况了