本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Java 多线程与等待和通知

发布于2024-12-03 10:18     阅读(149)     评论(0)     点赞(0)     收藏(1)


我有这段代码

public MultiThreadedSum(ArrayBuffer ArrayBufferInst)
{
    this.ArrayBufferInst = ArrayBufferInst;
    Sum = 0;
    Flag = false;
    StopFlag = false;
}

public synchronized void Sum2Elements()
{

    while(Flag)
    {
        try {wait();}
        catch (InterruptedException e){}
    }

    Flag = true;

    if (StopFlag)
    {
        notifyAll();
        return;
    }

    System.out.println("Removing and adding 2 elements.");

    Sum = ArrayBufferInst.Sum2Elements();

    notifyAll();
}

public synchronized void InsertElement()
{

    while(!Flag)
    {
        try {wait();}
        catch (InterruptedException e){}
    }

    Flag = false;

    if (StopFlag)
    {
        notifyAll();
        return;
    }

    System.out.println("Inserting the sum.");

    ArrayBufferInst.InsertElement(Sum);

    if (ArrayBufferInst.RetunrSize() == 1)
    {
        StopFlag = true;
    }

    System.out.println(ArrayBufferInst);

    notifyAll();
}

如您所见,我首先将 Flag 设置为 false,以便其中一个线程可以进入 Sum2Elements 方法并将其更改为 true,从而让每个人都等待。

我知道在同步代码中,只有一个线程可以执行其操作,这里我有两个同步方法,这是否意味着在每个notifyall之后都有两个线程尝试执行此方法?

如果是这样,那么一个线程是否不能进入 Sum2Elements,在另一个线程进入 InsertElement 之前将标志更改为 true,从而跳过 while 循环?

谢谢


解决方案


锁是针对类的对象而不是针对任何特定的同步方法获得的。这两种方法都是实例方法。因此,如果其中一个线程已进入某个对象的任何同步方法,例如 A,那么任何其他线程都不能进入该对象的任何同步方法,直到正在运行的线程不调用notifyAll()方法。在此阶段,所有等待线程都会竞争成为活动线程,但这取决于线程调度程序来选择要成为活动线程的线程。

如果您希望两个不同的线程同时访问这些同步方法,那么这两个线程应该对该类的两个不同对象进行操作。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/694206/0d8138496d24b3d894a8/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

0 0
收藏该文
已收藏

评论内容:(最多支持255个字符)