class Caller extends Thread
{
String s;
Caller(String s)
{
this.s=s;
}
void call(String msg)
{
synchronized (this)
{
System.out.print("["+msg);
try
{
Thread.sleep(1000);
}
catch(Exception e)
{
System.out.println(e);
}
System.out.println("]");
try
{
Thread.sleep(1000);
}
catch(Exception e)
{
System.out.println(e);
}
}
}
public void run()
{
call(s);
}
}
public class SynchronisedBlock {
public static void main(String[] args) {
Caller c=new Caller("hi");
Caller c1=new Caller("li");
Caller c2=new Caller("wi");
c.start();
c1.start();
c2.start();
}
}
public class SynchronisedBlock {
public static void main(String[] args) {
Caller c=new Caller("hi");
Caller c1=new Caller("li");
Caller c2=new Caller("wi");
c.start();
c1.start();
c2.start();
}
}
我正在尝试使用synchronized块获取对call()的同步访问但没有获得该功能。当我将call()方法放在另一个类中时,我获得了所需的功能但不在此代码中。我错过了什么?谁能告诉我为什么?提前完成。
答案 0 :(得分:0)
正如@svasa所说,你需要有一个共同的同步对象。
代码最简单的工作示例是使用共享的lock
对象。此外,lock
是final
以防止它被代码中的其他位置替换,您最终会在不同对象上进行同步。 (感谢@ P.J.Meisch):
class Caller extends Thread {
String s;
private static final Object lock = new Object();
Caller(String s) {
this.s = s;
}
void call(String msg) {
synchronized (lock) {
System.out.print("[" + msg);
try {
Thread.sleep(1000);
} catch (Exception e) {
System.out.println(e);
}
System.out.println("]");
try {
Thread.sleep(1000);
} catch (Exception e) {
System.out.println(e);
}
}
}
public void run() {
call(s);
}
答案 1 :(得分:0)
如果您的run
方法与Runnable
类似,而不是Thread
,那么您可以传递相同的Runnable
实例每个线程和this
将作为同步对象引用。