Четное Нечетное число с использованием системы блокировки потоков - PullRequest
0 голосов
/ 04 июля 2018

Сегодня я немного потренировался в Thread и пытался создать одну программу с четным нечетным числом. Я создал это с помощью синхронизированного, и он работал нормально. Но когда я попытался сделать то же самое с помощью Lock, я застрял.

Ниже приведен код, который я пытаюсь сделать то же самое.

public class OddEvenNumberThreadLock {

public static void main(String args[]) {

    SharedObject sharedObject = new SharedObject();

    Thread evenThread = new Thread(new EvenNumber(sharedObject));
    Thread oddThread = new Thread(new OddNumber(sharedObject));

    evenThread.start();
    oddThread.start();
}

}



 class EvenNumber implements Runnable {
SharedObject object;

public EvenNumber(SharedObject object) {
    this.object = object;
}

@Override
public void run() {

    for (int i = 0; i <= 100; i = i + 2) {

        while (!object.isOdd()) {
            object.getLock().lock();
            try {
                System.out.println("Even : " + i);
                object.setOdd(true);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                object.getLock().unlock();

            }

        }

    }

}

}
class OddNumber implements Runnable {
SharedObject object;

public OddNumber(SharedObject object) {
    this.object = object;
}

@Override
public void run() {

    for (int i = 1; i <= 100; i = i + 2) {

        while (object.isOdd()) {
            object.getLock().lock();
            try {
                System.out.println("Odd : " + i);
                object.setOdd(false);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                object.getLock().unlock();

            }

        }

    }

}
}

class SharedObject {
private Lock lock;
private boolean isOdd;

public SharedObject() {
    this.lock = new ReentrantLock();

}

public boolean isOdd() {
    return isOdd;
}

public void setOdd(boolean isOdd) {
    this.isOdd = isOdd;
}

public Lock getLock() {
    return lock;
}

public void setLock(Lock lock) {
    this.lock = lock;
}
}

У меня есть еще один вопрос: в случае синхронизации мы используем метод notify для информирования другого потока. Как мы можем добиться этого в случае с Локом.

Спасибо

1 Ответ

0 голосов
/ 05 июля 2018

Насколько я могу сказать, вы хотите добиться, чтобы две ваши нити печатали четные и нечетные числа в стиле пинг-понга. Требуемое поведение легче реализовать с помощью ReentrantLock, чем с блоком synchronized, поскольку synchronized всегда нечестно, но вы можете заставить ReentrantLock быть справедливым, используя подходящий конструктор. Вот как будет выглядеть ваша программа с Lock s:

public class App {

    public static void main(String args[]) {

        SharedObject sharedObject = new SharedObject();

        Thread evenThread = new Thread(new EvenNumber(sharedObject));
        Thread oddThread = new Thread(new OddNumber(sharedObject));

        evenThread.start();
        oddThread.start();
    }

}


class EvenNumber implements Runnable {
    SharedObject object;

    public EvenNumber(SharedObject object) {
        this.object = object;
    }

    public void run() {
        int i = 0;
        while(i <= 100) {
            object.getLock().lock();
            try {
                if (!object.isOdd()) {
                    System.out.println("Even : " + i);
                    i = i + 2;
                    object.setOdd(true);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                object.getLock().unlock();

            }
        }
    }
}

class OddNumber implements Runnable {
    SharedObject object;

    public OddNumber(SharedObject object) {
        this.object = object;
    }

    public void run() {
        int i = 1;
        while(i <= 100) {

            object.getLock().lock();
            try {
                if(object.isOdd()) {
                    System.out.println("Odd : " + i);
                    i = i + 2;
                    object.setOdd(false);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                object.getLock().unlock();

            }

        }

    }
}

class SharedObject {
    private Lock lock;
    private boolean isOdd;

    public SharedObject() {
        this.lock = new ReentrantLock(true);

    }

    public boolean isOdd() {
        return isOdd;
    }

    public void setOdd(boolean isOdd) {
        this.isOdd = isOdd;
    }

    public Lock getLock() {
        return lock;
    }

    public void setLock(Lock lock) {
        this.lock = lock;
    }

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