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();
}
}
}