public class Test implements Runnable {
int a =100;
private synchronized void thread1(){
a=1000;
try{
Thread.sleep(5000);
} catch(Exception e){
}
System.out.println("a = " + a);
try{
Thread.sleep(1000);
} catch(Exception e){
}
}
private void thread2(){
a =2000;
try{
Thread.sleep(1000);
} catch(Exception e){
}
System.out.println(a);
}
public void run(){
try{
thread1();
} catch(Exception e){
}
}
public static void main(String[] args){
Test t = new Test();
Thread th = new Thread(t);
try{
th.start();
} catch(Exception e){
}
t.thread2();
}
}
输出结果是:
1000
a=1000
如果把红色是绿色部分顺序换过来,输出结果变成:
2000
a=2000
这是什么原因呢,对线程的理解还是不够,有高人指点下么。。。
------解决方案--------------------
Thread.sleep(long)就是当前线程暂停指定毫秒数,然后继续。
------解决方案--------------------
public static void main(String[] args) {
Test t = new Test();
Thread th = new Thread(t);
try {
th.start();
} catch (Exception e) {
}
t.thread2();
}调用th.start()将启动一个新线程,新线程并不影响主线程的继续执行,所以th.start()和t.thread2()是同时执行的,thread2()属于主线程,在这个过程中,启动线程也是需要一定的时间的,所以th.start()的时候,t.thread2()已执行了a=2000并sleep(1000),此时新线程启动完成并开始执行a = 1000并sleep(5000),主线程睡眠时间过了继续执行thread2()中的代码System.out.println(a);输出1000,新线程睡眠时间过了便继续执行System.out.println("a = " + a);,所以可以理解为thread2()在thread1()之前执行,所以a=1000;
按楼主的做法,将红色和绿色换位置后,thread2()马上就sleep(1000),睡眠过程中新线程已启动完成执行a = 1000并sleep(5000),主线程睡眠时间过了便继续执行System.out.println(a);,新线程睡眠时间过了便继续执行System.out.println("a = " + a);,就是这样的。