实现线程的两种方式
在Java语言中,有两种方式使用线程
1. 使用Thread对象本身来创建一个新的线程,并且在其中执行异步逻辑处理(所谓的异步,就是我们把进程创建的,给我们执行操作的线程默认是主线程,当我们在这个主线程中又创建了一个新的线程来执行其他任务的时候,我们常常称新的线程处理的是异步任务)。
2. 另外一种就是将异步逻辑封装成一个任务,将任务交给Executor处理。
第一种方法是比较基础,后一种稍微高级一点。我们先了解第一种方式,后续的博客了解第二种方式。
Thread方式
一般来说,使用Thread在编程上有两种写法。
第一种写法
new Thread(new Runnalbe() {
@Override
public void run() {
//在这里执行的逻辑就是在一个新的线程中了
//可以尝试在这里打印当前的线程的信息,并与在外部打印进行比较
}
}).start();
我们创建了一个Thread对象,该对象接受一个Runnable对象来处理另一个线程中的逻辑。于是我们又创建了Runnable对象来处理异步逻辑,最后我们调用Thread类的start方法来运行启动线程。新的线程是有独特的名称的,可以通过Thread类的方法来打印当前线程的id、名称等。
int threadId = Thread.currentThread().getId();
int threadName = Thread.currentThread().getName();
第二种写法
public class MyThread extends Thread {
@Override
public void run() {
//在这里执行的逻辑就是在一个新的线程中了
//可以尝试在这里打印当前的线程的信息,并与在外部打印进行比较
}
}
... ...
//在main函数或其他入口执行
new MyThread().start();
这种写法创建了一个新的类,这里起名字MyThread,该类继承自Thread,我们重写run方法,最后我们创建MyThread对象,并调用继承而来的start方法。同样,run方法中将执行异步逻辑。
虽然两种方法都可以得到正确的结果,但是你应该使用第一种,因为第二种要求你的任务一定是Thread的子类,Java种一个类只能继承一个类,那么这将强迫你将任务类封装在Thread的子类中,不灵活。虽然现在可能还不明显。第二个原因在于,我们前面说的更高级的方式Executor就是采用了第一种Runnable的写法,使用第一种,有助于后面的理解。