[英]Thread Synchronization in java
为什么我无法在下面的程序上实现同步:
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:
你好用户
再见用户
你好用户
再见用户
再见用户
...
我想要以下形式的OP:
你好用户
你好用户
您好用户。
再见用户
再见用户
再见用户
还是我的同步概念错了?
您不能从P
类进行此类同步。 现在发生的是,如果另一个线程当前正在执行该方法,则对pp()
所有调用都将被阻止。 只要方法结束(如果您只是要将内容打印到控制台,这将很快),则将允许下一个线程进入该方法。
除非两个线程都相互了解并相互通信,否则您将无法实现目标。 换句话说,当第一个线程完成其所需的操作时,它应明确通知第二个线程开始。 这实际上是顺序执行的,而不是并行执行的。
您想可视化正在发生的事情,所以我在这里做。
for
循环。 然后调用P.pp()
。 P.pp()
,它将锁定 P
对象。 P
的锁定。 synchronize
块,它将等待(阻塞)。 P.pp()
。 Synchronized关键字意味着该代码块上的两个线程必须遵守它们尝试访问该块代码的顺序。 这并不意味着执行流程已序列化。
要拥有想要的内容,请尝试将for放在同步块中...
你应该尝试这样的事情
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();
}
}
即,在睡眠时保持线程同步,以便获得所需的输出,否则您不确定睡眠后哪个线程可能首先出现。 看到这个
您能解释一下我程序的控制流程吗?
“ Hello”启动并循环运行,直到达到synchronized
方法
“再见”也一样。
“ Hello”是第一个获得锁的人。
“再见”阻止等待锁。
“ Hello”执行该方法并释放锁。
“ Bye”现在可以获取该锁,“ Hello”已释放它
“ Bye”现在可以执行该方法,并像“ Hello”一样释放该锁。
我该怎么办,以便在执行该方法后打招呼进入阻塞的池,并且也不会留下锁让再见
握住锁,如果要保留它,请勿释放它。
public void run() {
synchronized(ob); { // hold the lock the whole time
for (int i = 1; i <= 5; ++i) {
ob.pp (s);
try { Thread.sleep(1000); } catch (Exception e) {}
}
} // releases the lock here.
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.