继承Thread类创建线程
java.lang.Thread类:描述线程的类,我们想要实现多线程程序,第一种方式就是继承这个类。
使用步骤如下:
- 创建一个类并继承Thread类
- 在该子类中重写Thread类的run方法,设置线程任务(开启线程要做什么?)
开启线程
首先创建Thread类或者子类对象,然后调用Thread类中的start方法,开启新的线程。底层执行的是Thread类的run方法,从而去执行重写的run方法,执行线程任务。
结果是两个线程并发地运行;当前线程(main线程)和另一个线程(创建的线程,间接执行run 方法)。
//创建一个新的线程
public class ThreadOne extends Thread{
@Override
public void run() {
//线程任务
for (int i = 0; i < 20; i++) {
System.out.println("run:"+i);
}
}
}
//使用多线程
public class ThreadOneTest {
public static void main(String[] args) {
//开启新的线程
ThreadOne one = new ThreadOne();
one.start();
//主线程的内容
for (int i = 0; i < 20; i++) {
System.out.println("main:"+i);
}
}
}
注意,java是抢占式调度,谁的优先级高先执行谁,如果优先级一样,随机选择一个,所以每次运行的结果顺序可能不一样。
注意:多次启动一个线程是非法的。
这里可以不直接创建子类,直接使用匿名内部类来实现:
多线程的内存图解
多线程的好处:多个线程之间互不影响,在不同的栈空间里。
实现Runnable接口创建线程
创建一个Runnable接口的实现类并重写Runnable接口中的run方法,设置线程任务。
这种创建线程的方式避免了继承的局限性:一旦继承了Thread类就不能再继承其它的类。而实现了Runnable接口,还可以再继承其它的类,还能实现其它的接口,更加灵活。
开启线程
使用Thread的以下构造方法传递Runnable接口的实现类,创建一个Thread对象
再调用Thread中的start方法,自动执行run方法。
注意:这里也可以直接用匿名内部类。
Runnable对象中封装的就是线程要执行的代码。
线程关闭
run方法执行完,线程就关闭了。