线程和同步队列

Threads and SynchronousQueue

我的代码有问题。

我的任务是编写程序,这类似于一些工厂生产煎饼,我必须使用同步队列。

分为三个步骤:

1。油炸.

之后在另一个线程中:

2。润滑.

最后一个是:

3。卷起这个煎饼:)

在我的程序中,我开始煎炸并创建“put”,这意味着我正在等待另一个方法中的调用“take”。但它不起作用。当程序要在 Greasing class.

中调用“greasing”方法时停止

主要内容:

public static void main(String[] args) {
    Factory f1 = new Factory();
    
    f1.start();
    
    Greasing g1 = new Greasing(f1);
    g1.start();
    
    RollingUp r1 = new RollingUp(f1);
    r1.start();
    
    
}

工厂Class:

public class Factory extends Thread{
// 0 - frying
// 1 - greasing 
// 2 - rolling up 


SynchronousQueue<String> list = new SynchronousQueue<>();

@Override
public void run() {
    try{
        while(true) frying();
    }catch(InterruptedException e){
        e.printStackTrace();
    }
}

private synchronized void frying()throws InterruptedException{

    System.out.println("I'm frying now");
    list.put("Frying");
    
    notify();
    
}

public synchronized void greasing() throws InterruptedException{
    notify();

    list.take();
    System.out.println("I'm greasing now");
    list.put("Greasing");
}

public synchronized void rollingup()throws InterruptedException{
    notify();

    list.take();
    System.out.println("I'm rolling up now");
    list.put("Rolling up");
    
}

}

润滑 class:

public class Greasing extends Thread{
Factory f1;

public Greasing(Factory f1) {
    this.f1 = f1;
}

@Override
public void run() {
    try{
        while(true){
            f1.greasing();
            sleep(1000);
        }
        
    }catch(Exception e){
        e.getMessage();
    }
}

}

滚动 class:

public class RollingUp extends Thread{
Factory f1;

RollingUp(Factory f1){
    this.f1 = f1;
}

@Override
public void run() {
    try{
        
        while(true){
            f1.rollingup();
            sleep(1000);
        }
    }catch(Exception e){
        e.getMessage();
    }
}

}

你有两种问题:

  1. 从您的代码中删除 notify()sychronized,这会阻止您,因为 synchronized 锁定了工厂 class,所以2 个线程不能同时进入工厂同步方法。最好将代码移到右边class,Greasing 必须出现在Greasing class。这将帮助您建立秩序并像对象一样思考。

  2. 修复了 1。您将看到每个操作现在都会发生,直到所有线程都在等待 put。 这是因为您需要为每个“消费者”设置不同的队列。在您的代码中,您可以从煎​​炸中触发 Rollingup,因为列表中的对象之间没有区别。

Frying操作必须将对象放入greasing队列,Greasing操作必须从他的队列中消费然后将对象放入Rollingup队列