Java-Java多线程生产者消费者

Java-Java多线程生产者消费者

虐人心 发布于 2017-08-05 字数 2955 浏览 1057 回复 3

我编写了生产者消费者的代码,每生产一个就消费一个,配对的出现,我设计的是生产10个,但是我运行后很少有生产10次的时候,这是为什么呢?而且通常情况下最后一个生产的产品都不能有相应的消耗,这是为什么呢?我让主线程已经sleep很长时间了~
希望各位大侠能帮帮我,这个问题我已经纠结了很久了~谢谢了!
代码如下:
其中代码中flag=true表示可以生产,=false表示不可以生产。

class Computer{
public static int iComputerCount;
private boolean flag=true;
public synchronized void productComputer(){
if(flag){
System.out.println("product one Computer!");
iComputerCount++;
flag=false;
super.notify();
}
else{
try{
super.wait();
flag=true;
}catch(InterruptedException e){
e.printStackTrace();
}
}

}
public synchronized void consumeComputer(){
if(!flag){
System.out.println("consume one Computer!");
flag=true;
super.notify();
}
else{
try{
super.wait();
flag=false;
}catch(InterruptedException e){
e.printStackTrace();
}
}

}
}
class Thread1 implements Runnable{
private Computer computer=null;
public Thread1(Computer computer){
this.computer=computer;
}
public void run(){
for(int i=0;i<10;i++){
computer.productComputer();
try{
Thread.sleep(300);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
class Thread2 implements Runnable{
private Computer computer=null;
public Thread2(Computer computer){
this.computer=computer;
}
public void run(){
for(int i=0;i<10;i++){
computer.consumeComputer();
try{
Thread.sleep(300);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
public class ComputerThreadTest{
public static void main(String[] args){
Computer computer=new Computer();
Thread1 thread1=new Thread1(computer);
Thread2 thread2=new Thread2(computer);
new Thread(thread1).start();
new Thread(thread2).start();
try{
Thread.sleep(10000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.print(computer.iComputerCount);
}
}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

瑾兮 2017-10-04 3 楼

你要把原来的循环改一下,这样写循环

while (computer.iComputerCount<10){
computer.productComputer();
try{
Thread.sleep(300);
}catch(InterruptedException e){
e.printStackTrace();
}
}

还有一个

super.wait();
// flag=true;

wait方法后面不需要再让flag赋值,重复了。因为

flag=false;
super.notify();

notify()上面你已经赋值过了,然后执行notify()就跳另一个线程的wait()方法后

偏爱自由 2017-09-19 2 楼

肯定是生产一个消费一个的,因为你在生产和消费方法中写的逻辑是生产了一个,然后将flag=!flag了,所以每次生产一个之后,就该消费了!
还有,就是你执行代码的时候,总共有三个线程,分别是main线程,thread1线程和thread2线程,Java中线程是为了解决并发问题,在你的代码中,thread1和thread2之间有协作关系,并且和main线程没有关系,也就是说,main线程执行结束了,thread1和thread2也不一定执行完,所以看不懂你在main中使用sleep是什么意思

晚风撩人 2017-09-09 1 楼

你的生产和消费方法逻辑都是不对的,而且sleep也是使用不当的。对你写的做了些修改,问题应该这样解决:当条件不满足时应该等待,当条件改变并满足时,执行。

class Computer {
public static int iComputerCount;
private boolean flag = true;

public synchronized void productComputer(int i) {
//用while(!flag)更好,只是只有2个线程所以if是可以的,如过有多个线程if是不可以的
if (!flag) {
try {
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(iComputerCount + "product one Computer!-" + i);
iComputerCount++;
flag = false;
notify();

}

public synchronized void consumeComputer(int i) {
//用while(flag)更好,只是只有2个线程所以if是可以的,如过有多个线程if是不可以的
if (flag) {
try {
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

System.out.println(iComputerCount + "consume one Computer!-" + i);
flag = true;
notify();

}
}

class Producter implements Runnable {
private Computer computer = null;

public Producter(Computer computer) {
this.computer = computer;
}

public void run() {
for (int i = 0; i < 10; i++) {
computer.productComputer(i);
}
}
}

class Consumer implements Runnable {
private Computer computer = null;

public Consumer(Computer computer) {
this.computer = computer;
}

public void run() {
for (int i = 0; i < 10; i++) {
computer.consumeComputer(i);
}
}
}

public class Test1 {
public static void main(String[] args) {
Computer computer = new Computer();
Thread p = new Thread(new Producter(computer));
p.start();
Thread c = new Thread(new Consumer(computer));
c.start();
while (!(p.getState() == Thread.State.TERMINATED && c.getState() == Thread.State.TERMINATED)) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(computer.iComputerCount);
}
}