public class Test implements Runnable { public static MyThread1 mt = new MyThread1();
public static void main(String[] args) {
Thread t = new Thread(new Test());
t.start();
new MyThread1().change();
} @Override
public void run() {
mt.Show();
}
}class MyThread1{
public synchronized void Show(){
System.out.println("a");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b");
}
public synchronized void change(){
System.out.println("1");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("2");
}
}
这样子它不是应该先打印:
1
2
a
b
可是结果却是:
1
a
b
2
它们都拿到锁了,不是该把change()里面的打印完才执行show()的吗。怎么会这样?!
public static void main(String[] args) {
Thread t = new Thread(new Test());
t.start();
new MyThread1().change();
} @Override
public void run() {
mt.Show();
}
}class MyThread1{
public synchronized void Show(){
System.out.println("a");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b");
}
public synchronized void change(){
System.out.println("1");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("2");
}
}
这样子它不是应该先打印:
1
2
a
b
可是结果却是:
1
a
b
2
它们都拿到锁了,不是该把change()里面的打印完才执行show()的吗。怎么会这样?!
调用sleep了肯定要交出线程的控制权
Thread.sleep
去掉之后就符合您的打印要求
Thread t1 = new Thread(new Test());
Thread t2 = new Thread(new Test());
t1.start();
t2.start();
//new MyThread1().change();
然后运行一下,
和把show方法的synchronized去掉再运行的结果比较,看看有什么不同就知道了
我博客里就有 可以看看去