线程的创建
创建线程的三种方式:
- 继承Thread类(由于Java单继承的原因,很少使用)
- 实现Runnable接口(常用)
- 实现Callable(了解)
一.继承Thread类
步骤:继承Thread类,重写run()方法,创建线程对象调用start()方法启动线程。
public class Text1 extends Thread{//继承Thread类
@Override
public void run() {
//run()方法线程体
for (int i = 0; i < 100; i++) {
System.out.println("我在写run()方法=========" + i);
}
}
public static void main(String[] args) {
//main线程 主线程
//创建一个线程对象
Text1 text1 = new Text1();
text1.start();//调用start()方法启动线程
for (int i = 0; i < 1000; i++) {
System.out.println("我在写main方法"+i);
}
}
}
部分结果截图:
通过结果截图可以看出,线程对象重写的run()方法的输出穿插在主线程的输出中,说明主线程和子线程是同时运行的,我们的线程创建成功;同时,这里也也已说明线程不是立即创建的,它需要CPU去安排调度。
二、实现Runnable接口
步骤:创建一个类实现Runnable接口,重写run()方法,创建线程对象,使用匿名类代理线程对象调用start()方法启动线程。
public class Text5 implements Runnable{
@Override
public void run() {
//run()方法线程体
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+"我在写run()方法--------" + i);
}
}
public static void main(String[] args) {
//main线程 主线程
//创建一个线程对象
Text5 text = new Text5();
new Thread(text,"李华").start();
new Thread(text,"张三").start();
new Thread(text,"王二").start();
for (int i = 0; i < 1000; i++) {
System.out.println("我在写main方法"+i);
}
}
}
部分结果截图:
通过结果截图可以看出,重写的run()方法的输出穿插在主线程的输出中,说明主线程和子线程同时运行,说明我们的线程创建成功。而且,也可以看出,实现Runnable接口,虽然我们只有一个子线程,但是我们可以有多个代理对线程对象进行调用。
三.小结
继承Thread类:
- 子类继承Thread类后具有多线程能力
- 启动线程:子类对象.start();
- 不建议使用,避免单继承的局限性
实现Runnable接口:
- 实现Runnable接口具有多线程能力
- 启动线程:传入目标对象+Thread对象.start();
- 推荐使用,避免单继承局限性,灵活方便,方便同一个对象被多个线程使用。