/*
* 实现线程的第一种方式:
* 编写一个类,直接继承java.lang.Thread 重写run方法
* */publicclassThreadTest01{
publicstaticvoidmain(String[] args){
MyThread m =newMyThread();//m.run();这样写,没有调用多线程,只是调用了一个普通方法而已
m.start();/**
* start方法的作用:
* 启动一个分支线程,在JVM中开辟出一个新的栈空间,开辟完成后,这段代码瞬间就结束了
* 而里面的run方法,是有JVM自动调用的,不需要手动调用
* 只要新的栈空间开出来,start()方法就结束了,线程就启动成功了
* 启动成功的线程会自动调用run方法,并且run方法在分支栈的底部(压栈)
* 和main方法一样(main方法是在主栈的底部),它俩是平级的
*
* 注意:代码仍然是自上而下依次执行的(java中亘古不变的定理)
*/for(int i =0; i <666; i++){
System.out.println("主线程--》"+ i);}}}classMyThreadextendsThread{
@Overridepublicvoidrun(){
//编写程序,这段程序运行在分支程序(分支栈)中for(int i =0; i <666; i++){
System.out.println("分支线程---》"+ i);}}}
/*
* 实现线程的第二种方式:编写一个类,实现java.lang.Runnable接口
* */publicclassThreadTest02{
publicstaticvoidmain(String[] args){
MyRunnable m =newMyRunnable();
Thread r =newThread(m);//直接合并也行
Thread e =newThread(newMyRunnable());//匿名内部类,其实也相当于class a implements Runnalbe,就是这个a,没有名字
Thread f =newThread(newRunnable(){
@Overridepublicvoidrun(){
for(int i =0; i <666; i++){
System.out.println("匿名内部类--->"+ i);}}});
f.start();//e.start();
r.start();for(int i =0; i <666; i++){
System.out.println("主线程-->"+ i);}}}classMyRunnableimplementsRunnable{
@Overridepublicvoidrun(){
for(int i =0; i <666; i++){
System.out.println("分支线程--->"+ i);}}}