一、繼承Thread類
- 自定義線程類繼承Thread類
- 重寫run()方法,編寫線程執行體
- 創建線程對象,調用start()方法啓動線程
- 不建議使用:避免OOP單繼承侷限性
package ThreadTest;
//創建線程的方式一:繼承Thread類,重寫run()方法,調用start開啓線程
//線程開啓不一定立即執行,由cpu調度執行
public class TestThread extends Thread{
@Override
public void run() {
// run()方法線程體
for (int i = 0; i <10 ; i++) {
System.out.println("子線程xxxxx");
}
}
public static void main(String[] args) {
//main線程,主線程
//創建一個線程對象
TestThread testThread = new TestThread();
//調用start()方法開啓線程
testThread.start();
for (int i = 0; i <100 ; i++) {
System.out.println("主線程xxxx");
}
}
}
運行結果:
二、實現Runnable接口
- 定義MyRunnable類實現Runnable接口
- 實現run()方法,編寫線程執行體
- 創建線程對象,調用start()方法啓動線程
- 推薦使用:避免單繼承侷限性,靈活方便,方便同一個對象被多個線程使用
package ThreadTest;
//創建線程的方式二:實現Runnable接口,重寫run方法,執行線程需要丟入runnable接口實現類,調用start方法
//線程開啓不一定立即執行,由cpu調度執行
public class TestThread implements Runnable{
@Override
public void run() {
// run()方法線程體
for (int i = 0; i <10 ; i++) {
System.out.println("子線程xxxxx");
}
}
public static void main(String[] args) {
//創建runnable接口的實現類對象
TestThread testThread = new TestThread();
//創建線程對象,通過線程對象來開啓我們的線程,代理模式
Thread thread = new Thread(testThread);
//調用start()方法開啓線程
thread.start();
for (int i = 0; i <100 ; i++) {
System.out.println("主線程xxxx");
}
}
}
三、實現Callable接口
- 實現Callable接口,需要返回值類型
- 重寫call方法,需要拋出異常
- 創建目標對象
- 創建執行服務
ExecutorService ser = Executors.newFixedThreadPool(1);
- 提交執行
Future <Boolean> result1 = ser.submit(t1);
- 獲取結果
boolean r1 = result1.get();
- 關閉服務
ser.shutdownNow();
代碼示例:
package ThreadTest;
import java.util.concurrent.*;
//線程的創建方式三:實現callable接口
//callable的好處:可以定義線程的返回值,可以拋出異常
public class TestCallable implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
for (int i = 0; i < 10; i++) {
System.out.println("子線程xxx");
}
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
TestCallable testCallable = new TestCallable();
//創建執行服務
ExecutorService ser = Executors.newFixedThreadPool(1);
//提交執行
Future<Boolean> r1 = ser.submit(testCallable);
//主線程內容
for (int i = 0; i < 100; i++) {
System.out.println("主線程");
}
//獲取結果
boolean rs1 = r1.get();
//打印返回值
System.out.println(rs1);
//關閉服務
ser.shutdownNow();
}
}
好了,今天這篇文章就到這裏啦,Java的學習一定要多寫多練。筆者會不定期做一些技術分享和工具使用心得,歡迎大家點贊和收藏!