Im делает многопоточное приложение, в котором пользователь добавляет по 1 ингредиент за один раз, чтобы сделать фруктовый салат. Существует максимальное количество фруктов, которые можно положить в миску.Проблемы с запуском нескольких потоков
Код компилируется и запускается, но проблема в том, что он работает только с одним потоком (Apple). Клубника имеет тот же самый поток thread.sleep (1000), что и яблоко. Я попробовал сменить сон клубнику на другое время сна, но это не устранило проблему.
Apple.java
public class Apple implements Runnable
{
private Ingredients ingredient;
public Apple(Ingredients ingredient)
{
this.ingredient = ingredient;
}
public void run()
{
while(true)
{
try
{
Thread.sleep(1000);
ingredient.setApple(6);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
Ingredients.java
public interface Ingredients
{
public void setApple(int max) throws InterruptedException;
public void setStrawberry(int max) throws InterruptedException;
}
FruitSalad.java
public class FruitSalad implements Ingredients
{
private int apple = 0;
private int strawberry = 0;
public synchronized void setApple(int max) throws InterruptedException
{
if(apple == max)
System.out.println("Max number of apples.");
else
{
apple++;
System.out.println("There is a total of " + apple + " in the bowl.");
}
}
//strawberry
}
Main.java
public class Main
{
public static void main(String[] args)
{
Ingredients ingredient = new FruitSalad();
new Apple(ingredient).run();
new Strawberry(ingredient).run();
}
}
Выход:
- В общей сложности в яблоке содержится 1 яблоко.
- ....
- В общей сложности в яблоке содержится 6 яблоко.
- Максимальное количество яблок.
Это потому, что вы не можете запускать их в отдельных потоках .. вы работаете как в текущем потоке, что приведет к их последовательному выполнению. – mre
Как запустить их в отдельных потоках? – user2273278
Кроме того, я бы порекомендовал, чтобы фруктолад ссылался на ингредиенты, а не наоборот. Это стандартная практика; многие к одному лучше, чем одни. –