使用线程锁定系统的偶数奇数

今天,我在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方法来通知其他线程。在Lock的情况下,我们如何实现这一目标。


慕哥6287543
浏览 167回答 1
1回答

侃侃尔雅

据我所知,您要实现自己的两个线程以乒乓方式打印偶数和奇数。您想要的行为ReentrantLock比使用synchronizedblock更容易实现,因为synchronized它总是不公平的,但是您可以ReentrantLock使用适当的构造函数使行为更加公平。这是Locks程序的外观:public class App {&nbsp; &nbsp; public static void main(String args[]) {&nbsp; &nbsp; &nbsp; &nbsp; SharedObject sharedObject = new SharedObject();&nbsp; &nbsp; &nbsp; &nbsp; Thread evenThread = new Thread(new EvenNumber(sharedObject));&nbsp; &nbsp; &nbsp; &nbsp; Thread oddThread = new Thread(new OddNumber(sharedObject));&nbsp; &nbsp; &nbsp; &nbsp; evenThread.start();&nbsp; &nbsp; &nbsp; &nbsp; oddThread.start();&nbsp; &nbsp; }}class EvenNumber implements Runnable {&nbsp; &nbsp; SharedObject object;&nbsp; &nbsp; public EvenNumber(SharedObject object) {&nbsp; &nbsp; &nbsp; &nbsp; this.object = object;&nbsp; &nbsp; }&nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; int i = 0;&nbsp; &nbsp; &nbsp; &nbsp; while(i <= 100) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; object.getLock().lock();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!object.isOdd()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Even : " + i);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = i + 2;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; object.setOdd(true);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } finally {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; object.getLock().unlock();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}class OddNumber implements Runnable {&nbsp; &nbsp; SharedObject object;&nbsp; &nbsp; public OddNumber(SharedObject object) {&nbsp; &nbsp; &nbsp; &nbsp; this.object = object;&nbsp; &nbsp; }&nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; int i = 1;&nbsp; &nbsp; &nbsp; &nbsp; while(i <= 100) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; object.getLock().lock();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(object.isOdd()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Odd : " + i);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = i + 2;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; object.setOdd(false);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } finally {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; object.getLock().unlock();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}class SharedObject {&nbsp; &nbsp; private Lock lock;&nbsp; &nbsp; private boolean isOdd;&nbsp; &nbsp; public SharedObject() {&nbsp; &nbsp; &nbsp; &nbsp; this.lock = new ReentrantLock(true);&nbsp; &nbsp; }&nbsp; &nbsp; public boolean isOdd() {&nbsp; &nbsp; &nbsp; &nbsp; return isOdd;&nbsp; &nbsp; }&nbsp; &nbsp; public void setOdd(boolean isOdd) {&nbsp; &nbsp; &nbsp; &nbsp; this.isOdd = isOdd;&nbsp; &nbsp; }&nbsp; &nbsp; public Lock getLock() {&nbsp; &nbsp; &nbsp; &nbsp; return lock;&nbsp; &nbsp; }&nbsp; &nbsp; public void setLock(Lock lock) {&nbsp; &nbsp; &nbsp; &nbsp; this.lock = lock;&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java