Man方法
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主线程运行结束!