Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在映射中循环并根据给定条件启动线程_Java_Multithreading_Swing - Fatal编程技术网

Java在映射中循环并根据给定条件启动线程

Java在映射中循环并根据给定条件启动线程,java,multithreading,swing,Java,Multithreading,Swing,我有一个JFrame和两个包含不同配料和菜肴的JTable。我制作的另一个类是KitchenStaff类,它是一个线程,每当有足够的原料库存满足菜谱要求时,就会使用每个菜的配方所需的原料。我还有另一个等级的无人机,可以更新原料的库存水平。问题是,当我启动多个线程时,至少有2种配料需要重新进货,两个线程只重新进货第一种配料。即使完成了,他们也不会费心重新进货。我的代码中是否有任何错误,以及如何使线程在不同的成分上运行 @Override public void run()

我有一个JFrame和两个包含不同配料和菜肴的JTable。我制作的另一个类是KitchenStaff类,它是一个线程,每当有足够的原料库存满足菜谱要求时,就会使用每个菜的配方所需的原料。我还有另一个等级的无人机,可以更新原料的库存水平。问题是,当我启动多个线程时,至少有2种配料需要重新进货,两个线程只重新进货第一种配料。即使完成了,他们也不会费心重新进货。我的代码中是否有任何错误,以及如何使线程在不同的成分上运行

  @Override
        public void run()
        {
            while (this.employed)
            {
                if (!dishStock.getDishStock().isEmpty())
                {

                    for (Map.Entry<SushiDish, Integer> dishEntry : dishStock.getDishStock().entrySet()) {
                        SushiDish dish = dishEntry.getKey();

                        int restockLevel = dishEntry.getValue();

                        if (isDishUnderStock(dish) && areIngredientsEnough(dish))
                        {

                            //int prepTime = new Random().nextInt(41) + 20;
                            int prepTime = 3;
                            try
                            {
                                Thread.sleep(prepTime * 1000);

                                for (Map.Entry<Ingredient, Integer> ingEntry : dish.getRecipe().entrySet())
                                {

                                    Ingredient ingr = ingEntry.getKey();

                                    int quantity = ingEntry.getValue();

                                    ingrStock.useIngredient(ingr, quantity);

                                    for(int i = 0; i < ingrStock.getIngredientsInStock().size(); i++)
                                    {
                                        if (ingrTable.getValueAt(i,0).toString().equals(ingr.getName()))
                                        {
                                            ingrTable.setValueAt(ingrStock.getIngredientsInStock().get(ingr), i, 3);
                                            model.fireTableDataChanged();
                                        }
                                    }
                                }

                            }
                            catch (InterruptedException e)
                            {

                            }

                        }
                    }
                }
            }
        }
@覆盖
公开募捐
{
当(这是受雇的)
{
如果(!dishStock.getDishStock().isEmpty())
{
对于(Map.Entry dishcentry:dishStock.getDishStock().entrySet()){
sushisdish dish=dishcentry.getKey();
int restockLevel=dishcentry.getValue();
如果(是库存不足(盘)和库存不足(盘))
{
//int prepTime=new Random().nextInt(41)+20;
int prepTime=3;
尝试
{
线程睡眠(预处理时间*1000);
对于(Map.Entry ingEntry:dish.getRecipe().entrySet())
{
配料ingr=ingEntry.getKey();
int quantity=ingEntry.getValue();
原料使用成分(原料、数量);
对于(int i=0;i
您应该在主线程上迭代,并为每个Ingredit启动一个新线程,然后您应该非常明显地更改标题,正如它所说:
根据给定的条件启动一个线程
。为什么要手动启动它们?@XtremeBaumer没问题,我会像往常一样找到自己的方法。