停留在多线程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中给出了多个错误”,你应该说错误是什么,或者至少是什么类型的错误。