1. 程式人生 > 其它 >多執行緒實現 入門

多執行緒實現 入門

多執行緒的實現方案一:繼承Thread類

1.定義一個子類MyThread繼承執行緒類java.lang.Thread,

2.重寫run()方法 建立MyThread類的物件

3.呼叫執行緒物件的start()方法啟動執行緒(啟動後還是執行run方法的)

public class ThreadDemo1 {
public static void main(String[] args) {
//3. new一個新執行緒物件
Thread t = new MyThread();
//4. 呼叫start方法啟動執行緒(執行的方法還是run)
t.start();//以執行緒的方式

for (int i = 0; i < 5; i++){
System.out.println("主執行緒執行輸出" +i);
}
}
}
/*
1.定義一個執行緒類繼承Thread類
*/
class MyThread extends Thread{
/*
2. 重寫run方法, 裡面是定義執行緒以後要幹啥
*/
@Override
public void run() {
for (int i = 0; i < 5 ; i++){
System.out.println("子執行緒執行輸出"+i);
}
}
}
-------------------------------------------

多執行緒的實現方案二:實現Runnable介面

1.定義一個執行緒任務類MyRunnable實現Runnable介面,

2.重寫run()方法 建立MyRunnable任務物件

3.把MyRunnable任務物件交給Thread處理。

4.呼叫執行緒物件的start()方法啟動執行緒

public class ThreadDemo1 {
public static void main(String[] args) {
//3. 建立一個任務物件
Runnable target = new MyThread();
//4. 把任務物件交給Thread處理
Thread t = new Thread(target);
//5. 啟動執行緒
t.start();

for (int i = 0; i < 10; i++){
System.out.println("主執行緒執行輸出 " +i);
}
}
}
/*
1.定義一個執行緒任務類實現Runnable介面
*/
class MyThread implements Runnable{
/*
2. 重寫run方法, 定義執行緒的執行任務的
*/
@Override
public void run() {
for (int i = 0; i < 10 ; i++){
System.out.println("子執行緒執行輸出 "+i);
}
}
}
方式二優缺點

優點:執行緒任務類只是實現介面,可以繼續繼承類和實現介面,擴充套件性強。

缺點:程式設計多一層物件包裝,如果執行緒有執行結果是不可以直接返回的。

第二種方法拓展: 使用匿名內部類簡化

------------------------------------------

第三種利用Callable、FutureTask介面實現

得到任務物件 定義類實現Callable介面,重寫call方法,封裝要做的事情。用FutureTask把Callable物件封裝成執行緒任務物件。

、把執行緒任務物件交給Thread處理。

、呼叫Thread的start方法啟動執行緒,執行任務

、執行緒執行完畢後、通過FutureTask的get方法去獲取任務執行的結果。

 

public class ThreadDemo1 {
public static void main(String[] args) {
//3. 建立Callable任務物件
Callable<String> call = new MyCallable(10);
//4. 把Callable任務物件, 交給FutureTask物件
// FutureTask物件的作用 1: 是Runnable的物件(實現了Runnable介面), 可以交給Thread了
// FutureTask物件的作用 2: 可以線上程執行完畢之後通過呼叫其get方法得到執行緒執行完成的結果
FutureTask<String> f1 = new FutureTask<>(call);
//5. 交給執行緒處理
Thread t1 = new Thread(f1);
//6. 啟動執行緒
t1.start();

Callable<String> call2 = new MyCallable(20);
FutureTask<String> f2 = new FutureTask<>(call2);
Thread t2 = new Thread(f2);
t2.start();

try {
f1.get();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class MyCallable implements Callable<String>{
private int n;
public MyCallable(int n) {
this.n = n;
}

@Override
public String call() throws Exception {
int sum = 0;
for (int i = 1; i<=n; i++){
sum += i;
}
return "最終結果"+sum;
}
}