为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2021-04-25 10:05:30
今天,我在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;}@Overridepublic 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;}@Overridepublic 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的情况下,我们如何实现这一目标。
查看完整描述

1 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

据我所知,您要实现自己的两个线程以乒乓方式打印偶数和奇数。您想要的行为ReentrantLock比使用synchronizedblock更容易实现,因为synchronized它总是不公平的,但是您可以ReentrantLock使用适当的构造函数使行为更加公平。这是Locks程序的外观:


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;

    }


}



查看完整回答
反对 回复 2021-05-12
  • 1 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号