gpt4 book ai didi

java - Java中的线程同步

转载 作者:行者123 更新时间:2023-11-29 07:25:36 25 4
gpt4 key购买 nike

为什么我无法在下面的程序中实现同步:

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();
}
}

运算符(operator):

你好用户

再见用户

你好用户

再见用户

再见用户

...

我想要以下形式的 OP:

你好用户

你好用户

你好用户..

再见用户

再见用户

再见用户..

还是我同步的概念有误?

最佳答案

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

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

更新

您想可视化正在发生的事情,所以我会在这里做。

  1. 您创建了 2 个话题。
  2. 您启动第一个线程。
  3. 第一个线程开始运行,一段时间后第二个线程也开始运行。
  4. 当您的第一个线程运行时,它会进入 for 循环。然后调用 P.pp()
  5. 当从第一个线程调用 P.pp() 时,它锁定 P 对象。
  6. 由于方法很短,所以很快就会退出。
  7. 当方法退出时,它会释放 P 上的锁。
  8. 如果您的第二个线程在第一个线程退出之前到达同步 block ,它将等待(阻塞)。
  9. 当第一个线程退出时,第二个线程进入,因为第一个线程释放锁。
  10. 第一个线程返回循环并尝试再次调用P.pp()
  11. 这将继续,取决于哪个线程更快,执行顺序会有所不同。

关于java - Java中的线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53665198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com