- 繼承Thread類創(chuàng)建線程類
定義Thread的子類,重寫run方法剔难,run方法定義線程的執(zhí)行邏輯劝评。創(chuàng)建該類的實例,并執(zhí)行start()方法因惭。
示例:
public class TestThread {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
System.out.println("Main函數(shù)執(zhí)行完成,執(zhí)行線程為:"+Thread.currentThread());
}
}
class MyThread extends Thread {
@Override
public void run() {
System.out.println("當前執(zhí)行線程:"+ Thread.currentThread() + ",MyThread run...");
}
}
執(zhí)行結(jié)果:
Main函數(shù)執(zhí)行完成,執(zhí)行線程為:Thread[main,5,main]
當前執(zhí)行線程:Thread[Thread-0,5,main],MyThread run...
- 通過Runnable接口創(chuàng)建線程類
定義Runnable接口的實現(xiàn)類,重寫run方法,創(chuàng)建該類的實例屈嗤,并將其作為參數(shù)創(chuàng)建Thread類的實例
示例:
public class TestThread {
public static void main(String[] args) {
testRunnable();
System.out.println("Main函數(shù)執(zhí)行完成,執(zhí)行線程為:"+Thread.currentThread());
}
private static void testRunnable() {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("當前執(zhí)行線程:"+ Thread.currentThread() + ",MyRunnable run...");
}
}
執(zhí)行結(jié)果:
- 通過Callable和Future創(chuàng)建線程
- 創(chuàng)建Callable接口的實現(xiàn)類潘拨,并實現(xiàn)call()方法,該call()方法將作為線程執(zhí)行體饶号,并且有返回值铁追。
- 創(chuàng)建Callable實現(xiàn)類的實例,使用FutureTask類來包裝Callable對象茫船,該FutureTask對象封裝了該Callable對象的call()方法的返回值琅束。
- 使用FutureTask對象作為Thread對象的target創(chuàng)建并啟動新線程扭屁。
- 調(diào)用FutureTask對象的get()方法來獲得子線程執(zhí)行結(jié)束后的返回值。
示例:
public class TestThread {
public static void main(String[] args) throws ExecutionException, InterruptedException {
testCallable();
System.out.println("Main函數(shù)執(zhí)行完成,執(zhí)行線程為:"+Thread.currentThread());
}
private static void testCallable() throws ExecutionException, InterruptedException {
MyCallable myCallable = new MyCallable();
FutureTask<String> futureTask = new FutureTask<>(myCallable);
Thread thread = new Thread(futureTask);
thread.start();
String threadResult = futureTask.get();
System.out.println("MyCallable執(zhí)行返回結(jié)果為:" + threadResult);
}
}
class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("當前執(zhí)行線程:"+ Thread.currentThread() + ",MyCallable run...");
return "執(zhí)行完成";
}
}
執(zhí)行結(jié)果:
當前執(zhí)行線程:Thread[Thread-0,5,main],MyCallable run...
MyCallable執(zhí)行返回結(jié)果為:執(zhí)行完成
Main函數(shù)執(zhí)行完成,執(zhí)行線程為:Thread[main,5,main]
- ExecutorService
ExecutorService是Java提供的線程池涩禀,可以需要使用線程的時候可以通過ExecutorService獲取線程料滥。它可以有效控制最大并發(fā)線程數(shù),提高系統(tǒng)資源的使用率艾船,同時避免過多資源競爭葵腹,避免堵塞,同時提供定時執(zhí)行屿岂、定期執(zhí)行践宴、單線程、并發(fā)數(shù)控制等功能爷怀。