停留在多线程java上

停留在多线程java上,java,multithreading,wait,notify,Java,Multithreading,Wait,Notify,因此,这段代码主要给出了多个错误。有人能告诉我这有什么问题吗 问题是创建消费者和生产者线程来制作灯。只允许使用两个耗电元件,每个灯具部件都有一个生产线 public class ProducerConsumerTest{ public static void main(String[] args){ StartProducer startproducer = new StartProducer(); System.out.println("Sta

因此,这段代码主要给出了多个错误。有人能告诉我这有什么问题吗

问题是创建消费者和生产者线程来制作灯。只允许使用两个耗电元件,每个灯具部件都有一个生产线

public class ProducerConsumerTest{




    public static void main(String[] args){

        StartProducer startproducer = new StartProducer();
        System.out.println("Start producer calling");
        startproducer.start();


    }
}
class StartProducer extends Thread{

    Screw screw = new Screw();
    Base base = new Base();
    Stand stand = new Stand();
    Socket socket = new Socket();
    LightBulb lightbulb = new LightBulb();
    int screws = screw.screwcount;
    int bases = base.basecount;
    int stands = stand.standcount;
    int sockets = socket.socketcount;
    int lightbulbs = lightbulb.bulbcount;
    Consumer1 consumer1 = new Consumer1();
    Consumer2 consumer2 = new Consumer2();
    public synchronized void run(){

        System.out.println("producer test");

            screw.start();


            base.start();


            stand.start();


            socket.start();


            lightbulb.start();




        boolean possible = possibleToBuildLamp(screws,bases,stands,sockets,lightbulbs);
        if(possible == true){
            consumer1.start();
            consumer2.start();

        }
    }

    private boolean possibleToBuildLamp(int screws, int bases, int stands,
            int sockets, int lightbulbs) {
        if(screws>=4 && bases>=1 && stands>=1 && sockets>=3 && lightbulbs>=3){
            return true;
        }

        else return false;
    }

}
class Screw extends Thread{

    public int screwcount;
     public synchronized void run(){
         while(true){
         if(screwcount>=0 && screwcount<7){
             screwcount++;
         }
         try {
            wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
     }

}
}

class Base extends Thread{
    public int basecount;
    public synchronized void run(){

    while(true){
         if(basecount>=0 && basecount <2){
             basecount++;
         }
         try {
            wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
}

class Stand extends Thread {
    public int standcount;
    public synchronized void run(){

    while(true){
         if(standcount>=0 && standcount<2){
             standcount++;
         }
    }

}
}

class Socket extends Thread {
    public int socketcount;
    public synchronized void run(){

    while(true){
         if(socketcount>=0 && socketcount<7){
             socketcount++;
         }
         try {
            wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
}

class LightBulb extends Thread {
    public int bulbcount;
    public synchronized void run(){

    while(true){

         if(bulbcount>=0 && bulbcount<4){
             bulbcount++;
         }
         try {
            wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
}



class Consumer1 extends Thread {
    ProducerConsumerTest test = new ProducerConsumerTest();
    StartProducer start = new StartProducer();


    public synchronized void run(){
        while(true){
        Screw screw = new Screw();
        Base base = new Base();
        Stand stand = new Stand();
        Socket socket = new Socket();
        LightBulb lightbulb = new LightBulb();

        screw.screwcount-=4;
        base.basecount-=1;
        stand.standcount-=1;
        socket.socketcount-=3;
        lightbulb.bulbcount-=3;
        System.out.println("one lamp made");
        start.notify();

        try {
            wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }


    }


}

class Consumer2 extends Thread {
ProducerConsumerTest test = new ProducerConsumerTest();
StartProducer start = new StartProducer();

    public synchronized void run(){

        while(true){
        Screw screw = new Screw();
        Base base = new Base();
        Stand stand = new Stand();
        Socket socket = new Socket();
        LightBulb lightbulb = new LightBulb();

        screw.screwcount-=4;
        base.basecount-=1;
        stand.standcount-=1;
        socket.socketcount-=3;
        lightbulb.bulbcount-=3;
        System.out.println("One lamp made");
        start.notify();
        try {
            wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



        }       

    }

}
公共类ProducerConsumerTest{
公共静态void main(字符串[]args){
StartProducer StartProducer=新的StartProducer();
System.out.println(“启动生产者调用”);
startproducer.start();
}
}
类StartProducer扩展线程{
螺钉=新螺钉();
基础=新基础();
支架=新支架();
套接字=新套接字();
灯泡=新灯泡();
内螺纹=螺纹。螺纹计数;
int base=base.basecount;
int stands=stand.standcount;
int sockets=socket.socketcount;
int lightbulls=lightbulls.bulbcount;
Consumer1 Consumer1=新的Consumer1();
Consumer2 Consumer2=新的Consumer2();
公共同步的无效运行(){
系统输出打印项次(“生产商测试”);
螺钉。开始();
base.start();
站起来,开始();
socket.start();
灯泡。启动();
布尔可能=可能的建筑灯具(螺钉、底座、支架、插座、灯泡);
如果(可能==true){
consumer1.start();
consumer2.start();
}
}
专用布尔型可能建筑灯(内部螺丝、内部底座、内部支架、,
内部插座、内部灯泡){
如果(螺钉>=4和底座>=1和支架>=1和插座>=3和灯泡>=3){
返回true;
}
否则返回false;
}
}
类螺钉延伸螺纹{
公众计数;
公共同步的无效运行(){
while(true){

如果(螺钉计数>=0&&screwcount=0&&basecount=0&&standcount=0&&socketcount=0&&bulbcount在main中,您创建了一个
启动生成器

StartProducer startproducer = new StartProducer();
StartProducer start = new StartProducer();
这将创建一个
消费者1

Consumer1 consumer1 = new Consumer1();
这将创建另一个新的
StartProducer

StartProducer startproducer = new StartProducer();
StartProducer start = new StartProducer();
它将创建另一个新的
Consumer1
。它将无法做任何其他事情,因为它无法创建无限多的
StartProducer
s来创建
Consumer1
s,直到它用StackOverlower错误崩溃。同样,对于
Consumer2
,如果它能够创建这些

如果只需要一个
StartProducer
对象,则需要在单个位置创建它,并将对它的引用传递给其他需要它的对象,例如将其作为构造函数的参数,或将其放置在共享变量中,以便它们可以访问它

另外,所有线程的
run()
方法是同步的
,这不会实现任何互斥,因为每个线程都在一个不同的对象上同步:该线程本身。如果您想提供有用的互斥,您将需要使用来在多个线程共享的特定对象上同步。

“第一次海报,所以请小心”-温和地说:不要只说“这段代码在main中给出了多个错误”,你应该说错误是什么,或者至少是什么类型的错误。