实现线程的第一种方式:
编写一个类,直接继承java.lang.Thread,重写run方法
怎么创建线程对象? new就行了
怎么启动线程呢? 调用线程对象的start()方法
注意:方法体中的代码永远都是自上而下的顺序依次逐行执行。
以下程序的输出结果有这样的特点:
有先有后,有多有少
public class ThreadTest02{
public static void main(String[] args){
//这里是main方法,这里的代码属于主线程,在主栈中运行。
//新建一个分支线程对象
MyThread myThread = new MyThread();
//启动线程
//myThread.run(); //不会启动线程,不会分配新的分支栈。(这种方式是单线程)
//start()方法的作用是:启动一个分支线程,在JVM中开辟一个新的栈空间,这段代码任务完成之后,瞬间就结束了。
//启动成功的线程会自动调用main方法,并且run方法在分支栈的栈底部(压栈)
//run方法在分支栈的栈底部,main方法在主栈的栈底部。run和main是平级的。
myThread.start();
//这里的代码还是运行在主线程中。
for(int i=0;i<1000;i++){
System.out.println("主线程-->"+i);
}
}
}
class MyThread extends Thread{
public void run(){
//编写程序,这段程序运行在分支线程中(分支栈)
for(int i=0;i<1000;i++){
System.out.println("分支线程-->"+i);
}
}
}
实现线程的第二种方式
编写一个类实现java.lang.Runnable接口
public class ThreadTest03{
public static void main(String[] args){
//创建一个可运行的对象
MyRunnable r = new MyRunnable();
//将可运行的对象封装成一个线程对象
//合并代码
//Thread t = new Thread(new MyRunnable());
Thread t = new Thread(r);
//启动线程
t.start();
for(int i=0;i<100;i++){
System.out.println("主线程-->"+i);
}
}
}
//这并不是一个线程类,是一个可运行的类,它还不是一个线程
class MyRunnable implements Runnable{
public void run(){
for(int i=0;i<100;i++){
System.out.println("分支线程-->"+i);
}
}
}
采用匿名内部类
public class ThreadTest04{
public static void main(String[] args){
//创建线程对象,采用匿名内部类方式
//这里通过一个没有名字的类,new出来
Thread t = new Thread(new Runnable(){
public void run(){
for(int i=0;i<100;i++){
System.out.println("分支线程是-->"+i);
}
}
});
//启动线程
t.start();
for(int i=0;i<100;i++){
System.out.println("分支线程是-->"+i);
}
}
}