创建线程的三种方式
Java中主要有三种实现多线程的方式:
- 继承
Thread
类 - 实现
Runnable
接口 - 实现
Callable
接口(可以获取线程执行后的返回值)
第一种方式是创建了一个继承于Thread
的多线程类,它本身就是一个线程;而后两种方式更准确的理解是创建了一个可执行的任务,要采用多线程的方式执行,即两种方式还是需要一个Thread
类来启动。
// 把一个实现Runnable接口的类放入Thread中,并启动该Thread线程
new Thread(new Runnable(){}).start();
所以三种方式的本质都是一样的,本质都是第一种。
在实际开发中,我们通常采用线程池的方式来完成Thread的创建,更好管理线程资源。
run() & start()
不管是继承Thread
还是实现Runnable
或Callable
,都需要实现run()
:它规定的是一个可执行的任务;而启动一个线程,需要执行一个Thread
的start()
:
Thread
class MyThread extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":running.....");
}
}
public static void main(String[] args){
MyThread thread = new MyThread();
//正确启动线程的方式
//thread.run();//调用方法并非开启新线程
thread.start();v
}
Runnable
class MyTask implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":running....");
}
}
public static void main(String[] args){
MyTask task = new MyTask();
//task.start(); //并不能直接以线程的方式来启动
//它表达的是一个任务,需要启动一个线程来执行
new Thread(task).start();
}
Callable
class MyTask2 implements Callable<Boolean>{
@Override
public Boolean call() throws Exception {
return null;
}
}
本质上来说创建线程的方式就是继承Thread,就是线程池,内部也是创建好线程对象来执行任务。
参考: