主线程和分线程的创建和死亡分析
1.简介线程的生命周期

2.问题引出
class MyThread implements Runnable{
static int i;
@Override
public void run() {
i++;
System.out.println("分线程中的i:"+MyThread.i);
}
}
public class testThread {
public static void main(String[] args) {
MyThread mt = new MyThread();
Thread t1 = new Thread(mt);
t1.start();
System.out.println("主线程中的i:"+MyThread.i);
}
}
结果:

由上面的结果可以看出分线程中的i发生了变化,主线程中打印的是分线程的Runnable实现类中的i,没有发生变化,还是原来的值。但是在main()函数中是先运行的t1.start(),再执行的打印语句。结果应该打印出的i=1,这是什么原因呢?
3、 原因分析并解决
在mian()函数中,主线程先执行,主线程将i值打印出来,此时的分线程还没有执行,所以打印出的i=0。当主线程执行结束死亡后分线程才开始执行。所以出现上述问题。此时引入join()方法解决此问题。
t.join()方法只会使主线程(或者说调用t.join()的线程)进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程。所以引入join()方法后,会暂停主线程,运行分线程,当分线程运行完后再返回主线程运行,就能够使i=1。
public static void main(String[] args) {
MyThread mt = new MyThread();
Thread t1 = new Thread(mt);
t1.start();
try {
t1.join(); //引入join()
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程中的i:"+MyThread.i);
}

6752



被折叠的 条评论
为什么被折叠?



