线程和同步队列
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();
}
}
}
你有两种问题:
从您的代码中删除 notify()
和 sychronized
,这会阻止您,因为 synchronized
锁定了工厂 class,所以2 个线程不能同时进入工厂同步方法。最好将代码移到右边class,Greasing 必须出现在Greasing class。这将帮助您建立秩序并像对象一样思考。
修复了 1。您将看到每个操作现在都会发生,直到所有线程都在等待 put
。
这是因为您需要为每个“消费者”设置不同的队列。在您的代码中,您可以从煎炸中触发 Rollingup,因为列表中的对象之间没有区别。
Frying操作必须将对象放入greasing队列,Greasing操作必须从他的队列中消费然后将对象放入Rollingup队列
我的代码有问题。
我的任务是编写程序,这类似于一些工厂生产煎饼,我必须使用同步队列。
分为三个步骤:
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();
}
}
}
你有两种问题:
从您的代码中删除
notify()
和sychronized
,这会阻止您,因为synchronized
锁定了工厂 class,所以2 个线程不能同时进入工厂同步方法。最好将代码移到右边class,Greasing 必须出现在Greasing class。这将帮助您建立秩序并像对象一样思考。修复了 1。您将看到每个操作现在都会发生,直到所有线程都在等待
put
。 这是因为您需要为每个“消费者”设置不同的队列。在您的代码中,您可以从煎炸中触发 Rollingup,因为列表中的对象之间没有区别。
Frying操作必须将对象放入greasing队列,Greasing操作必须从他的队列中消费然后将对象放入Rollingup队列