Нечетная печать четного числа с использованием нити - PullRequest
7 голосов
/ 16 мая 2011

Печать нечетного четного числа с использованием потока. Создайте один класс потока, два экземпляра потока.Один напечатает нечетное число, а другой напечатает четное число.

Я сделал следующую кодировку.Но дело доходит до тупика.Кто-нибудь может объяснить, в чем может быть причина?

public class NumberPrinter implements Runnable{
private String type;
private static boolean oddTurn=true;


public NumberPrinter(String type){
    this.type=type;
}
public void run() {
    int i=type.equals("odd")?1:2;
    while(i<10){
        if(type.equals("odd"))
            printOdd(i);
        if(type.equals("even"))
            printEven(i);
        i=i+2;
    }

}

private synchronized void printOdd(int i){
    while(!oddTurn){
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    System.out.println(type + i);
    oddTurn=false;
    notifyAll();
}

private synchronized  void printEven(int i){
    while(oddTurn){
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace(); 
        }
    }
    System.out.println(type + i);
    oddTurn=true;
    notifyAll();

}

public static void main(String[] s){
    Thread odd=new Thread(new NumberPrinter("odd"));
    Thread even=new Thread(new NumberPrinter("even"));
    odd.start();
    even.start();

}
}

Out Put: odd1 even2


затем заходит в тупик !!!!!!

Спасибо за вашу помощь.

Ответы [ 11 ]

0 голосов
/ 16 мая 2011

Вы пропустили ключевое слово volatile в переменной oddTurn.Без этого нет никаких гарантий, что потоки увидят фактическое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...