一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java 實現多線程的幾種方式匯總

Java 實現多線程的幾種方式匯總

2020-04-11 14:31hebedich JAVA教程

JAVA多線程實現方式主要有三種:繼承Thread類、實現Runnable接口、使用ExecutorService、Callable、Future實現有返回結果的多線程。其中前兩種方式線程執行完后都沒有返回值,只有最后一種是帶返回值的。

我們先來看段示例代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
 
public class Main {
 
  public static void main(String[] args) {
    //方法一:繼承Thread
    int i = 0;
//    for(; i < 100; i++){
//      System.out.println(Thread.currentThread().getName() + " " + i);
//      if (i == 5) {
//        ThreadExtendsThread threadExtendsThread = new ThreadExtendsThread();
//        threadExtendsThread.start();
//      }
//    }
    
    //方法二:實現Runnable
//    for(i = 0; i < 100; i++){
//      System.out.println(Thread.currentThread().getName() + " " + i);
//      if (i == 5) {
//        Runnable runnable = new ThreadImplementsRunnable();
//        new Thread(runnable).start();
//        new Thread(runnable).start();
//      }
//    }
 
    //方法三:實現Callable接口
    Callable<Integer> callable = new ThreadImplementsCallable();
    FutureTask<Integer> futureTask = new FutureTask<>(callable);
    for(i = 0; i < 100; i++){
      System.out.println(Thread.currentThread().getName() + " " + i);
      if (i == 5) {
        new Thread(futureTask).start();
        new Thread(futureTask).start();
      }
    }
    try {
      System.out.println("futureTask ruturn: " + futureTask.get());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
 
}

接下來我們來詳細探討下Java 實現多線程的幾種方式

方法一,繼承自Thread

?
1
2
3
4
5
6
7
8
9
public class ThreadExtendsThread extends Thread {
  private int i;
  @Override
  public void run() {
    for(; i < 100; i++) {
      System.out.println(getName() + " " + i);
    }
  }
}

run方法為線程執行體,ThreadExtendsThread對象即為線程對象。

方法二,實現Runnable接口

?
1
2
3
4
5
6
7
8
9
public class ThreadImplementsRunnable implements Runnable {
  private int i;
  @Override
  public void run() {
    for(; i < 100; i++){
      System.out.println(Thread.currentThread().getName() + " " + i);
    }
  }
}

run方法為線程執行體,使用時New一個Thread對象,Runnable對象作為target傳遞給Thread對象。且同一個Runnable對象可作為多個Thread的target,這些線程均共享Runnable對象的實例變量。

方法三,實現Callable接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.concurrent.Callable;
 
public class ThreadImplementsCallable implements Callable<Integer> {
  private int i;
  
  @Override
  public Integer call() throws Exception {
    for(; i < 100; i++){
      System.out.println(Thread.currentThread().getName() + " " + i);
    }
    return i;
  }
}

Callable接口類似于Runnable接口,但比對方強大,線程執行體為call方法,該方法具有返回值和可拋出異常。使用時將Callable對象包裝為FutureTask對象,通過泛型指定返回值類型??缮院蛘{用FutureTask的get方法取回執行結果。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: videos欧美肥婆 | 高清在线一区二区 | 亚洲视频在线一区二区 | 欧美伊人久久久久久久久影院 | 亚洲精品在线网址 | 我和黑色丝袜班主任 | 99热精品成人免费观看 | 成人免费一区二区三区在线观看 | 温柔校草高h | 国产99视频精品免视看7 | 免费亚洲视频 | 国产99热99 | 我们中文在线观看免费完整版 | 美女在尿口隐私视频 | 无码爽死成人777在线观看网站 | 91久久国产成人免费观看资源 | 91进入蜜桃臀在线播放 | 人人澡 人人澡碰人人看软件 | 亚洲精品国产一区二区三区在 | 91大片淫黄大片在线天堂 | 国产精品毛片久久久久久久 | 农村老妇1乱69系列小说 | 桃花岛在线 | 猫咪社区免费资源在线观看 | 亚洲第一区欧美日韩精品 | chinesespank打屁股 | 99久久精品久久久久久清纯 | 美女靠逼动漫 | 成人在线日韩 | 亚洲国产欧美另类va在线观看 | 波多野结衣女老师 | 天天有好逼| 亚洲精品第一国产综合 | 九九精品视频一区二区三区 | 热99re久久精品国产首页 | 久久国产综合精品欧美 | 欧美亚洲天堂网 | 98精品全国免费观看视频 | 欧美午夜视频一区二区三区 | 亚洲视频一区网站 | 久久精品亚洲牛牛影视 |