为什么我无法在下面这段程序上实现同步:
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的形式为:
你好,用户
你好,用户
你好,用户..
再见用户
再见用户
再见用户..
或者我对同步的概念是错误的?
发布于 2018-12-07 15:48:50
您不能从P类进行这样的同步。现在发生的情况是,如果另一个线程正在执行该方法,则任何对pp()的调用都会被阻塞。只要方法结束(如果您只是要将内容打印到控制台,这会很快),下一个线程将被允许进入该方法。
您试图实现的目标是不可能实现的,除非两个线程都知道彼此并相互通信。换句话说,当第一个线程完成它需要做的事情时,它应该显式地通知第二个线程开始。这实际上是顺序执行,而不是并行执行。
更新
您想要可视化正在发生的事情,所以我将在这里进行。
for循环。然后它从第一线程调用,它锁定了第一个线程的块,这个方法很短,它会退出,方法退出,它会释放锁,第二个线程在第一个线程退出之前,会到达P.pp().P.pp(),P,synchronize,它会等待第一个线程退出,第二个线程在第一个线程释放锁时进入。P.pp()。发布于 2018-12-07 15:49:26
Synchronized关键字意味着代码块上的两个线程必须遵守它们尝试访问该块代码的顺序。这并不意味着执行流程是序列化的。
为了得到你想要的东西,试着把for放在同步代码块中...
发布于 2018-12-07 15:57:16
你应该试试这样的东西
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
https://stackoverflow.com/questions/53665198
复制相似问题