本文最后更新于721 天前,其中的信息可能已经过时,如有错误请发送邮件到echobydq@gmail.com
前提
主要通过继承java.lang.Thread类,并覆盖Thread类的run()方法完成线程的创建
Thread类是一个具体的类,即不是抽象类,该类封装了线程的行为。要创建线程,需先创建一个Thread类的子类,Thread类中有两个最重要的方法run()和start()
run()方法必须重写,把线程所要的代码加入到这个方法中,也就是线程体
虽然run()方法是线程体,但不能直接调用,而是通过调用start()方法来启动线程。在调用start()的时候,start()方法会首先进行与多线程相关的初始化,然后调用run()方法
start和run方法
start: 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法run称为线程体,它包含了要执行的这个线程的内容,run方法运行结束,此线程随机终止。
run:run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的
代码
public class MyThread extends Thread{
//count变量用于统计打印次数并共享变量
private static int count = 0;
public MyThread(String name)
{
//super 关键字可以在子类的构造方法中显式地调用父类的构造方法
//访问父类的成员方法和变量
super(name);
}
public static void main(String[] args) {
//main方法开始
//实例化线程
MyThread p = new MyThread("t1");
p.start();
//主线程main方法执行一个循环
for(int i=1; i<4; i++){
count++;
//主线程中打印count+"main"变量的值,并换行
System.out.println("主线程 "+ count +" main");
}
}
public void run(){
//线程类必须有run()方法
for(int i=1; i<4; i++){
count++;
System.out.println("run方法 "+count+": "+this.getName());
}
}
}
运行结果
主线程 1 main
run方法 2: t1
主线程 3 main
run方法 4: t1
主线程 5 main
run方法 6: t1
这段程序用Java虚拟机启动程序后,main方法生成新线程t1,并通过for循环输出变量count的值和线程名称