这里有两种方法
继承Thread类
实现Runnable接口
推荐使用实现Runnable接口
一、继承Thread
子类继承Thread类具备多线程能力
启动线程:子类对象.start()
不建议使用,避免OPP单继承局限性
1.自定义线程类
2.重写run()方法
3.调用start()方法重启线程
注意:线程开启不一定立即执行,由CPU调度
package Lesson01;
/*
1.自定义线程类
2.重写run()方法
3.调用start()方法重启线程
注意:线程开启不一定立即执行,由CPU调度
*/
public class TestThread1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("自定义线程类"+i);
}
}
public static void main(String[] args) {
//main方法,主线程
//定义线程
TestThread1 testThread1 = new TestThread1();
testThread1.start();//调用start()方法,开启线程
//
for (int i = 0; i < 200; i++) {
System.out.println("main主线程"+i);
}
}
}
/*部分结果
main主线程0
自定义线程类0
main主线程1
自定义线程类1
main主线程2
自定义线程类2
main主线程3
自定义线程类3
main主线程4
自定义线程类4
main主线程5
自定义线程类5
自定义线程类6
自定义线程类7
自定义线程类8
自定义线程类9
main主线程6
*/
二、实现Runnable接口
实现接口Runnable具有多线程能力
启动线程:传入目标对象+Thread对象.start()
推荐使用,避免单继承局限性
ublic class TestThread2 implements Runnable{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("自定义线程类"+i);
}
}
public static void main(String[] args) {
//创建runnable接口的实现类对象
TestThread2 testThread2 = new TestThread2();
//创建线程对象,通过线程对象来开启线程
Thread thread = new Thread(testThread2);
//开启线程
thread.start();
/*
或者前面的三步可以总结成一步
new Thread(testThread2).start();
*/
for (int i = 0; i < 200; i++) {
System.out.println("main主线程"+i);
}
}
}
总结:
其实Thread也继承了Runnable接口,所以最终直接 子类对象.start() 启动就行
我们直接继承Runnable接口,则相当于多写了一步,所以需要先创建接口类的实现对象,再创建线程对象,通过线程对象启动
最终都是通过线程对象.start()启动