Main方法相当一个主线程,JVM会自动寻找class文件中的main方法并执行(请思考tomcat加载java web项目启动的线程数和每次tomcat服务器接收到请求,是不是要发起一个线程去处理)
以下的例子展现了Main主线程中启动了两个分支线程(mTh1和mTh2)
package com.kevin.test1; class Thread1 extends Thread{
private String name;
public Thread1(String name) {
super(name);
this.name=name;
}
public void run() {
System.out.println(Thread.currentThread().getName() + " 线程运行开始!");
for (int i = 0; i < 5; i++) {
System.out.println("子线程"+name + "运行 : " + i);
try {
sleep((int) Math.random() * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " 线程运行结束!");
}
} public class Main { public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()+"主线程运行开始!");
Thread1 mTh1=new Thread1("A");
Thread1 mTh2=new Thread1("B");
mTh1.start();
mTh2.start();
// main是主线程,mTh1和mTh2属于主线程的分支线程,程序运行之后,JVM会主动调用程序的Main主线程,
// 每次运行程序,JVM都会启动一个线程(进程由多个线程组成)
// join方法 主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束
/*try { */
/* mTh1.join(); */
/* mTh2.join();*/
/*} catch (InterruptedException e) {*/
/* e.printStackTrace();*/
/*}*/
System.out.println(Thread.currentThread().getName()+ "主线程运行结束!"); } }
执行结果
main主线程运行开始!
main主线程运行结束!
B 线程运行开始!
A 线程运行开始!
子线程B运行 : 0
子线程A运行 : 0
子线程B运行 : 1
子线程A运行 : 1
子线程B运行 : 2
子线程A运行 : 2
子线程B运行 : 3
子线程A运行 : 3
子线程B运行 : 4
子线程A运行 : 4
B 线程运行结束!
A 线程运行结束!
添加mTh1.join(); mTh1.join();执行结果:
main主线程运行开始!
A 线程运行开始!
B 线程运行开始!
子线程B运行 : 0
子线程A运行 : 0
子线程A运行 : 1
子线程B运行 : 1
子线程A运行 : 2
子线程B运行 : 2
子线程A运行 : 3
子线程B运行 : 3
子线程A运行 : 4
子线程B运行 : 4
A 线程运行结束!
B 线程运行结束!
main主线程运行结束!