Всем привет!
Я пока плохо понимаю нити, поэтому решил придумать сам себе задачу чтобы разобраться. Идея программы:
• Создаем внешнюю нить OuterThread из которой вызываем 2 других нити – Egg и Chicken.
• Потом OuterThread засыпает на 5 секунд, чтобы передать управление Egg и Chicken.
• Egg и Chicken должны спорить между собой о том, кто появился раньше. Каждая нить должна высказывать об этом и потом засыпать на время случайный промежуток времени time.
• После того как 5 секунд сна OuterThread истекли, OuterThread должна определить какая нить из двух - Egg или Chicken сейчас НЕ спит и признать ее победителем
Проблема в том, что вызванная первой нить Egg монополизирует управление и не даже засыпая не хочет отдавать управление нити Chicken.
Подскажите, пожалуйста, как исправить ошибку?
public class MyChickenEgg {
public static void main(String[] args) {
Egg egg = new Egg();
Chicken chicken = new Chicken();
OuterThread outer = new OuterThread(egg, chicken);
}
public static int time(){
double proxy = Math.random();
int time = (int) Math.round(proxy*100);
return time;
}
public static class OuterThread extends Thread{
private Egg t1;
private Chicken t2;
OuterThread(Egg t1, Chicken t2){
super();
this.t1 = t1;
this.t2 = t2;
start();
}
public void run(){
try{
t1.run();
t1.sleep(MyChickenEgg.time());
t2.run();
t2.sleep(MyChickenEgg.time());
Thread.sleep(5000);
if (t1.isAlive()){
System.out.println("Победила " + t1.name);
t1.interrupt();
t2.interrupt();
}else{
System.out.println("Победила " + t2.name);
t1.interrupt();
t2.interrupt();
}
}catch (InterruptedException e){
System.out.println("Нити кончились!");
}
}
}
public static class Egg extends Thread{
private String name = "Яичко";
private int Ttime = 0;
private static boolean marker = false;
@Override
public void run() {
try {
while (!marker){
System.out.println("Раньше появилось яйцо!");
Ttime = MyChickenEgg.time();
sleep(Ttime);
System.out.println("Задержка на " + Ttime);
}
}catch (InterruptedException e){}
}
}
public static class Chicken extends Thread{
public String name = "Курочка";
private static boolean marker = false;
public void run() {
try {
while (!marker){
System.out.println("Раньше появилась курица!");
Thread.sleep(MyChickenEgg.time());
}
}catch (InterruptedException e){}
}
}
}