我实现了下面的类并得到了这个输出:
dsfs2000
2000
b = 1000;
我想知道为什么不是:
b = 1000;
dsfs2000
2000
由于t.start()
会先调用m1()
而m2()
应该等到m1()
完成,为什么m2()
实际上会先获得锁定?
public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
//Thread.sleep(2000);
b = 1000;
//Thread.sleep(5000);
System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
Thread.sleep(2500);
b = 2000;
System.out.println("dsfs" + b);
}
public void run() {
try {
m1();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
tt.m2();
System.out.println(tt.b);
}
}
答案 0 :(得分:0)
在您的代码中
t.start(); // has to go through the overhead of creating a Thread and calling back its `run`
tt.m2(); // just calling a method on a already created Object, which is really fast
答案 1 :(得分:0)
在m1()
方法中,在结尾添加notify();
,在第一个m2()
添加wait();
,然后就可以了。
这是完整的代码:我已经更改了两个地方。评论为// here
public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
//Thread.sleep(2000);
b = 1000;
//Thread.sleep(5000);
System.out.println("b = " + b);
notify(); // here
}
public synchronized void m2() throws Exception {
wait(); // here
Thread.sleep(2500);
b = 2000;
System.out.println("dsfs" + b);
}
public void run() {
try {
m1();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
tt.m2();
System.out.println(tt.b);
}
}
这是你想要的输出:
b = 1000
dsfs2000
2000
说明 m2()
将等到m1()
完成作业并通知m2();
答案 2 :(得分:0)
回答您的问题:您的main
方法在您的应用程序的主线程中执行。在调用t.start();
时,您要求JVM组成一个新线程并执行Runable
。这同时发生,也需要一些时间。调用start方法不会阻止主线程继续执行代码。因此,tt.m2()
被调用。在JVM创建新线程时,执行runnable
的星星会打印出sysouts
的{{1}}。想象这种行为。您可以将当前时间添加到runnable
。