首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中的线程同步

java中的线程同步
EN

Stack Overflow用户
提问于 2018-12-07 15:40:16
回答 4查看 135关注 0票数 1

为什么我无法在下面这段程序上实现同步:

代码语言:javascript
复制
class P
{

synchronized void pp(String s)
    {
        System.out.println (s);
    }
}

class threadA extends Thread 
{
    P ob;
    String s;
    threadA (P ob, String s)
    {
        this.ob = ob;
        this.s = s;
    }
    public void run ()
    {
        for (int i=1;i<=5;++i)
        {
        ob.pp (s);
        try
        {
            Thread.sleep (1000);
        }
        catch (Exception e) {}
        }
    }
}


class gain 
{
    public static void main(String[] args) {
        P ob = new P ();
        threadA a = new threadA (ob,"Hello User");
        threadA b = new threadA (ob,"Bye User");
        a.start();
        b.start();
    }
}

操作:

你好,用户

再见用户

你好,用户

再见用户

再见用户

..。

我希望OP的形式为:

你好,用户

你好,用户

你好,用户..

再见用户

再见用户

再见用户..

或者我对同步的概念是错误的?

EN

回答 4

Stack Overflow用户

发布于 2018-12-07 15:48:50

您不能从P类进行这样的同步。现在发生的情况是,如果另一个线程正在执行该方法,则任何对pp()的调用都会被阻塞。只要方法结束(如果您只是要将内容打印到控制台,这会很快),下一个线程将被允许进入该方法。

您试图实现的目标是不可能实现的,除非两个线程都知道彼此并相互通信。换句话说,当第一个线程完成它需要做的事情时,它应该显式地通知第二个线程开始。这实际上是顺序执行,而不是并行执行。

更新

您想要可视化正在发生的事情,所以我将在这里进行。

  1. 你创建了两个线程。
  2. 你启动第一个线程。
  3. 第一个线程开始运行,一段时间后第二个线程也开始运行。
  4. 当你的第一个线程运行时,它进入for循环。然后它从第一线程调用,它锁定了第一个线程的块,这个方法很短,它会退出,方法退出,它会释放锁,第二个线程在第一个线程退出之前,会到达P.pp().
  5. When,object.
  6. Since,P.pp()Psynchronize,它会等待第一个线程退出,第二个线程在第一个线程释放锁时进入。
  7. 第一个线程返回到循环并再次尝试调用P.pp()
  8. 这将继续,具体取决于哪个线程更快,执行顺序会有所不同。
票数 2
EN

Stack Overflow用户

发布于 2018-12-07 15:49:26

Synchronized关键字意味着代码块上的两个线程必须遵守它们尝试访问该块代码的顺序。这并不意味着执行流程是序列化的。

为了得到你想要的东西,试着把for放在同步代码块中...

票数 1
EN

Stack Overflow用户

发布于 2018-12-07 15:57:16

你应该试试这样的东西

代码语言:javascript
复制
class P
{

void pp(String s)
    {
        System.out.println (s);
    }
}

class threadA extends Thread 
{
    P ob;
    String s;
    threadA (P ob, String s)
    {
        this.ob = ob;
        this.s = s;
    }
    public void run ()
    {
        for (int i=1;i<=5;++i)
        {
            synchronized(ob)
            {
               ob.pp (s);
                try
                {
                    Thread.sleep (10);
                }
                catch (Exception e) {}
            }


        }
    }
}


public class gain 
{
    public static void main(String[] args) {
        P ob = new P ();
        threadA a = new threadA (ob,"Hello User");
        threadA b = new threadA (ob,"Bye User");
        a.start();
        b.start();
    }
}

也就是说,在休眠时保持线程同步,以便获得所需的输出,否则您不确定哪个线程可能在休眠后最先出现。请参阅this

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53665198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档