### 三種創建方式 - Thread class 繼承Thread類 - Runnable介面 實現Runnable介面 - Callable介面 實現Callable介面 ### Thread - 自定義線程類繼承Thread類 - 重寫run()方法,編寫線程執行體 - 創建線程對象,調用st ...
三種創建方式
- Thread class 繼承Thread類
- Runnable介面 實現Runnable介面
- Callable介面 實現Callable介面
Thread
-
自定義線程類繼承Thread類
-
重寫run()方法,編寫線程執行體
-
創建線程對象,調用start()方法啟動線程
//創建線程方式一:繼承Thread類,重寫run()方法,調用start開啟線程 //註意,線程開啟不一定立即執行,由cpu調度執行 public class TestThread extends Thread{ @Override public void run() { //run方法線程體 for (int i = 0; i < 20; i++) { System.out.println("我在Run方法"+i); } } public static void main(String[] args) { //main線程,主線程 //創建一個線程對象 TestThread testThread=new TestThread(); //調用start()方法開啟線程 testThread.start(); for (int i = 0; i < 20; i++) { System.out.println("我在main函數中"+i); } } }
註:run方法只是普通方法,直接調用程式只是先後分別執行兩個方法,而start方法,相當於另外開闢一個子線程,去執行run方法,也就是實現兩個方法同時進行;
編譯部分結果:(每次結果都可能不一樣)
我在main函數中0 我在Run方法0 我在main函數中1 我在Run方法1 我在main函數中2 我在Run方法2 我在main函數中3 我在Run方法3 我在Run方法4 我在Run方法5 我在Run方法6 我在main函數中4 我在Run方法7 我在main函數中5 我在main函數中6 我在Run方法8 ...........
實現Runable
- 定義MyRunnable類實現Runnable介面
- 實現run()方法,編寫線程執行體
- 創建線程對象,調用start()方法啟動線程
//實現線程方式2:實現runnable介面,重寫run方法,執行線程需要丟入runnable介面實現類,調用start方法
public class TestThread2 implements Runnable{
@Override
public void run() {
//run方法線程體
for (int i = 0; i < 20; i++) {
System.out.println("我在Run方法"+i);
}
}
public static void main(String[] args) {
//main線程,主線程
//創建runnable介面的實現類對象
TestThread2 testThread2=new TestThread2();
//創建線程對象,通過線程對象來開啟我們的線程,代理
// Thread thread=new Thread(testThread2);
// thread.start();
new Thread(testThread2).start();
for (int i = 0; i < 20; i++) {
System.out.println("我在main函數中"+i);
}
}
}
編譯部分結果:(每次結果都可能不一樣)
我在main函數中0
我在Run方法0
我在main函數中1
我在Run方法1
我在main函數中2
我在Run方法2
我在main函數中3
我在Run方法3
我在Run方法4
我在main函數中4
........
小結
繼承thread
- 子類繼承Thread類具備多線程能力
- 啟動線程:子類對象.start()
- 不建議使用:避免OOP單繼承
實現Runnable介面
- 實現介面Runnable具備多線程能力
- 啟動線程:傳入目標對象+Thread對象.start()
- 推薦使用:避免單繼承局限性,靈活性,方便同一個對象被多個線程使用
實現Callable介面
- 實現Callable介面,需要返回值類型
- 重寫call方法,需要拋出異常
- 創建目標對象
- 創建執行服務:ExecutorService ser=Executors.newFixedThreadPool(1);
- 提交執行:Future
result1=ser.submit(t1); - 獲取執行:boolean r1=result1.get();
- 關閉服務:ser.shutdownNow();
//線程創建方式三:實現callable介面
/*
callabel的好處
1,可以定義返回值
2,可以拋出異常
*/
public class CallableTest implements Callable<Boolean> {
private String url;//下載網路圖片地址
private String name; //保存的文件名
public CallableTest(String url, String name) {
this.name = name;
this.url = url;
}
//下載圖片線程的執行體
public Boolean call() {
WebDownLoder webDownLoder = new WebDownLoder();
webDownLoder.downLoader(url, name);
System.out.println("下載好文件" + name);
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
CallableTest t1=new CallableTest("https://img0.baidu.com/it/u=1435639120,2241364006&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500","1.jpg");
CallableTest t2=new CallableTest("https://img1.baidu.com/it/u=2559867097,3726275945&fm=253&fmt=auto&app=138&f=JPEG?w=1333&h=500","2.jpg");
CallableTest t3=new CallableTest("https://img0.baidu.com/it/u=2503372846,402736698&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800","3.jpg");
//1. 創建執行服務:
ExecutorService ser= Executors.newFixedThreadPool(3);
//2. 提交執行:
Future<Boolean> r1=ser.submit(t1);
Future<Boolean> r2=ser.submit(t2);
Future<Boolean> r3=ser.submit(t3);
//3. 獲取執行:
boolean rs1=r1.get();
boolean rs2=r2.get();
boolean rs3=r3.get();
//4. 關閉服務:
ser.shutdownNow();
}
}
//下載器
class WebDownLoder{
//下載方法
public void downLoader(String url, String name) {
try {
FileUtils.copyURLToFile(new URL(url), new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO異常,downLoader方法出現問題");
}
}
}