Java 线程终止和运行问题

Java 线程终止和运行问题,java,multithreading,Java,Multithreading,现在我正在使用线程,试图学习如何以正确的方式编写代码:)现在我的代码有问题 package main; import java.util.Random; public class Pick extends Thread { private Controll controll; public Pick(Controll controll) { this.controll = controll; } public void run() { while (true) {

现在我正在使用线程,试图学习如何以正确的方式编写代码:)现在我的代码有问题

package main;
import java.util.Random;

public class Pick extends Thread
{
private Controll controll;

 public Pick(Controll controll)
{
  this.controll = controll;
}

public void run()
{

  while (true)
  {
     int itemID = generateItemID();

     try {
        controll.Pick(itemID);
    } catch (InterruptedException e) {

        e.printStackTrace();
    };

     System.out.println("Item: " + itemID + " picked!");
     System.out.println(controll.getFill() + " of " + controll.getPalletSize());

        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {

            e.printStackTrace();
        }


  }
}

public int generateItemID()
{
  Random randomGenerator = new Random();
  int itemID = randomGenerator.nextInt(100);
  return itemID;
}

}
和其他类

package main;
import java.util.ArrayList;

public class Controll
{
private ArrayList<Integer> ItemID;
private int PalletID;
private int PalletSize;
private int Fill;
private volatile boolean running = true;

 public Controll()
{
   this.ItemID = new ArrayList<>();
}

public synchronized void Pick(int itemID) throws InterruptedException

{
   while(running)
   {
     if (getPalletSize() == Fill)
     {
         terminate();
        System.out.println("Pallet is full!");
        for(int i = 0; i <ItemID.size();i++)
        {
            System.out.println(ItemID.get(i));
        }

       wait();

     }
     else
     {


  ItemID.add(itemID);
  Fill++;
  notifyAll();
     }
}
}

public synchronized int getPalletID()
{
   return PalletID;
}

public synchronized int getPalletSize()
{
    return PalletSize;
}

public synchronized void setPalletSize(int size)
{
    this.PalletSize = size;
}

public synchronized int getFill()
{
    return Fill;
}

public synchronized void setFill(int size)
{
    this.Fill = size;
}

public void terminate() {
    running = false;
}
}

我得到的结果是: 货盘满了! 3. 3. 3. 3. 3. 3. 3. 3. 三,


我试图让托盘装满时,它必须停止向arraylist添加新项目,它必须显示添加到arraylist中的每个项目,但它只打印出arraylist中的内容,也许有人可以帮我解决这个问题?

为了正确使用Random,您应该创建一次,然后选择需要的次数

将随机成员更改为类静态成员。并将其置于
私人控制下
private static Random_GENERATOR=new Random()

在这个场景中,我们只创建一次random,但多次使用它。
欲了解更多有关伪数生成器的信息,请阅读伪数生成器

它没有显示您想要的行为,因为当您执行
控制.Pick(itemID)时,它正在调用Controll类中的
公共同步无效拾取(int itemID)抛出InterruptedException
。在该方法中,若托盘未满,则尝试将项目添加到列表中。 所以当你执行的时候

while(running)


    {
         if (getPalletSize() == getFill())
         {
             terminate();
            System.out.println("Pallet is full!");
            for(int i = 0; i <this.ItemID.size();i++)
            {
                System.out.println(this.ItemID.get(i));
            }

           wait();

         }
         else
         {


      this.ItemID.add(itemID);
      Fill++;
      notifyAll();
         }
    }
    }
运行时
{
如果(getPalletSize()==getFill())
{
终止();
System.out.println(“托盘已满!”);
对于(int i=0;i
public int generateItemID()
{
  int itemID = RANDOM_GENERATOR.nextInt(100);
  return itemID;
}
while(running)


    {
         if (getPalletSize() == getFill())
         {
             terminate();
            System.out.println("Pallet is full!");
            for(int i = 0; i <this.ItemID.size();i++)
            {
                System.out.println(this.ItemID.get(i));
            }

           wait();

         }
         else
         {


      this.ItemID.add(itemID);
      Fill++;
      notifyAll();
         }
    }
    }