從我實(shí)習(xí)面試開始就有在面試中遇到過這個(gè)問題:創(chuàng)建線程有幾種方法
記得當(dāng)時(shí)的回答是:在jdk1.5之后有三種創(chuàng)建方式
1.繼承Thread類
2.實(shí)現(xiàn)Runnable接口
3.實(shí)現(xiàn)Callable接口
工作之后回顧這個(gè)問題就會(huì)想到器罐,這三種方式的不同點(diǎn)在哪呢晴裹?所有有了探究的這篇文章
雖然網(wǎng)上已經(jīng)有很多文章珠玉在前楷怒,但是我還是想寫一篇我自己的文章炼蹦,如果寫的不好逮壁,請(qǐng)見諒
先來實(shí)現(xiàn)最基本的創(chuàng)建線程的三種方式吧
1.繼承Thread類
/**
* @author miao
*/
public class ThreadDemo extends Thread {
private final String threadName;
public ThreadDemo(String threadName) {
this.threadName = threadName;
}
@Override
public void run() {
System.out.println(threadName + Thread.currentThread().getName());
}
public static void main(String[] args) {
// 多線程級(jí)別調(diào)用
new ThreadDemo("test thread demo:").start();
// 方法級(jí)別的調(diào)用
new ThreadDemo("test thread demo:").run();
}
}
2.實(shí)現(xiàn)Runnable接口
/**
* @author miao
*/
public class RunnableDemo implements Runnable {
@Override
public void run() {
System.out.println("RunnableDemo:" + Thread.currentThread().getName());
}
public static void main(String[] args) {
Thread thread = new Thread(new RunnableDemo());
thread.start();
}
}
3.實(shí)現(xiàn)Callable接口
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
* @author miao
*/
public class FutureTaskDemo implements Callable<String> {
@Override
public String call() throws Exception {
return "return callable demo";
}
public static void main(String[] args) throws Exception {
FutureTask task = new FutureTask(new FutureTaskDemo());
new Thread(task).start();
System.out.println(task.get());
}
}
已經(jīng)完成了三種創(chuàng)建線程的方式了颓遏,那么我們就來思考一下這三種方式的相同點(diǎn)和不同點(diǎn)吧
其實(shí)關(guān)于最常見面試題的就是:Runnable與Callable的不同點(diǎn)是什么徐矩?
一般同學(xué)會(huì)回答:Runnable無返回值,而Callable有返回值能拋異常