这里是Themberfue
· 上一节我们使用了最基础的方式来创建一个线程,并实现了多线程代码的运行。
· 这一节我们更进一步的介绍其他创建线程的方式。
Thread
我们先来看一段通过Thread类创建线程的代码
public class Demo3 {
public static void main(String[] args) throws InterruptedException {
// 创建匿名内部类,继承了Thread类
Thread t = new Thread() {
@Override
public void run() {
while (true) {
System.out.println("hello thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
};
t.start();
while (true) {
System.out.println("My main");
Thread.sleep(1000);
}
}
}
· 上述代码创建与之前说到的略有不同,这次而是直接通过new Thread类来实现。
· 但其实本质上和上节的无二区别,这是通过匿名内部类创建,该匿名内部类继承了Thread,并重写了 run 方法,随后启动该线程。
· 随后启动线程,线程执行的逻辑就是匿名内部类重写run方法里的代码逻辑。
· 这样写的好处之一就是不用创建过多的类,方便后续更改其执行逻辑。
Runnable
· 前面我们提到,直接在Thread类里重写run方法,执行里面的逻辑,那么代码的耦合性会增大,这是不利于后续进一步编程的。
· 所以实现Runnable接口重写run方法,随后通过Thread的构造方法,执行run方法里的逻辑。这是一种解耦合的方式,它将线程和任务的概念分开了,不至于耦合在一起。
public class Demo4 {
public static void main(String[] args) throws InterruptedException {
// 匿名内部类,实现了Runnable接口
Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("hello thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
};
Thread t = new Thread(runnable);
t.start();
while (true) {
System.out.println("