当前位置: 代码迷 >> J2SE >> 线程有关问题的困惑
  详细解决方案

线程有关问题的困惑

热度:87   发布时间:2016-04-23 20:34:54.0
线程问题的困惑
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

这是什么原因呢,对线程的理解还是不够,有高人指点下么。。。
------解决方案--------------------
引用:
我把改值放在sleep下面的时候 输出就是2000,改值放在sleep上面却是1000,有点懵了

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);,就是这样的。
  相关解决方案