繼承Thread
優(yōu)點(diǎn):可以直接使用Thread類中的方法,代碼簡單
缺點(diǎn):繼承Thread類之后就不能繼承其他的類
實(shí)現(xiàn)Runnable接口
優(yōu)點(diǎn):即時(shí)自定義類已經(jīng)有父類了也不受影響貌笨,因?yàn)榭梢詫?shí)現(xiàn)多個(gè)接口
缺點(diǎn): 在run方法內(nèi)部需要獲取到當(dāng)前線程的Thread對(duì)象后才能使用Thread中的方法
實(shí)現(xiàn)Callable接口
優(yōu)點(diǎn):可以獲取返回值,可以拋出異常
缺點(diǎn):代碼編寫較為復(fù)雜
使用匿名內(nèi)部類創(chuàng)建線程
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* 使用匿名內(nèi)部類創(chuàng)建多線程
*
*/
public class ThreadTest04 {
public static void main(String[] args) throws InterruptedException, ExecutionException {
/*
* Thread
*/
new Thread() { // 1.繼承Thread類
public void run() { // 2.重寫run方法
for (int i = 0; i < 1000; i++) { // 3.將要執(zhí)行的代碼寫在run方法中
System.out.println("Thread");
}
}
}.start(); // 4.開啟線程
/*
* Runnable
*/
new Thread(new Runnable() { // 1.將Runnable的子類對(duì)象傳遞給Thread的構(gòu)造方法
public void run() { // 2.重寫run方法
for (int i = 0; i < 1000; i++) { // 3.將要執(zhí)行的代碼寫在run方法中
System.out.println("Runnable");
}
}
}).start(); // 4.開啟線程
/*
* Callable
*/
ExecutorService exec = Executors.newCachedThreadPool(); // 1.創(chuàng)建線程池
Future<Integer> result = exec.submit(new Callable<Integer>() {// 2.向線程池中添加線程
@Override
public Integer call() throws Exception { //3.重寫call方法
return 1024;
}
});
System.out.println(result.get()); //4.獲取返回結(jié)果
}
}