在Java中使用多线程

在Java中使用多线程,java,multithreading,Java,Multithreading,我正在尝试制作一个多线程程序作为家具工厂。。。例如,制作一张桌子需要3颗钉子、2块木头和1块胶水。我制作了胶水、木材和钉子类(作为螺纹类的扩展) 现在,按照我的方式,它没有编译错误,但是当它运行时,我在thread.start()处得到一个IlegalThreadState异常。这是我的主要观点 任何帮助都会很好 无法重新启动线程。请查看文档以了解更多信息。它说: 多次启动线程是不合法的 你在一个循环中一次又一次地启动相同的线程。相反,您应该看看ExecutorService的工作原理,并使用它

我正在尝试制作一个多线程程序作为家具工厂。。。例如,制作一张桌子需要3颗钉子、2块木头和1块胶水。我制作了胶水、木材和钉子类(作为螺纹类的扩展)

现在,按照我的方式,它没有编译错误,但是当它运行时,我在thread.start()处得到一个IlegalThreadState异常。这是我的主要观点


任何帮助都会很好

无法重新启动线程。请查看文档以了解更多信息。它说:

多次启动线程是不合法的

你在一个循环中一次又一次地启动相同的线程。相反,您应该看看ExecutorService的工作原理,并使用它。好的多线程系统是基于作业的,每个作业要么是可运行的,要么是可调用的。当您只想运行某个任务而它没有任何输出时(特别是,如果作业实际上返回了
void
),可以使用
Runnable
。当作业确实返回某些内容时,使用
Callable
。关于如何使用
ExecutorService
和相关类,这里和其他地方有很多例子

如果您别无选择,只能手动使用线程,则需要在每个循环上创建并启动一个新线程,例如:

new Formica().start();

与反复启动相同的
Formica
实例相反。

可能线程不可启动,因为它已经在运行/已经在运行。试着在每次
开始之前发出
getState()
调用(并打印结果)。确保您提到这是一项家庭作业。如果有人想知道:clavo=nail,madera=wood,mueble=(一件)家具你们三个都是对的。使用下面的答案,我可以让它运行。啊,我明白了。。。我将进行一些更改并发布结果。。。我想是新手犯的错误好吧,我做了一些改变,程序运行得很顺利。唯一的问题是,在达到它应该制作的30张桌子之后,一些线程仍然在接收材料(并使用他们的sys out这样说),尽管没有创建更多的家具(这很好)。这仅仅是因为线程没有完成它们的例程吗?另外,即使在创建了30个表并且所有内容都已停止之后,程序仍在运行(但显然没有执行任何操作)是否缺少某些内容,例如刷新内存或其他内容?尽管如此,我找到了我要查找的内容(System.exit())
@Override
public void run()
{
    try {
        sclavo.acquire();
        System.out.println("Llega 1 clavo");
        System.out.println("Hay " + (3-sclavo.availablePermits()) + " clavo(s)");
        if((sclavo.availablePermits()==0)&&(Madera.smadera.availablePermits()==0)&&(Formica.sformica.availablePermits()==0))
                {
                    System.out.println("Se ha creado 1 mueble");
                    Main.mueble++;
                    System.out.println("Hay" + Main.mueble + "mueble(s)");
                    Formica.sformica.release(1);
                    sclavo.release(3);
                    Madera.smadera.release(2);
                }
    } catch (InterruptedException ex) {
        Logger.getLogger(Clavo.class.getName()).log(Level.SEVERE, null, ex);
    }
}
new Formica().start();