国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Java 實(shí)現(xiàn)多線程的幾種方式匯總

Java 實(shí)現(xiàn)多線程的幾種方式匯總

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

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

我們先來(lái)看段示例代碼

?
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();
//      }
//    }
    
    //方法二:實(shí)現(xiàn)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();
//      }
//    }
 
    //方法三:實(shí)現(xiàn)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();
    }
  }
 
}

接下來(lái)我們來(lái)詳細(xì)探討下Java 實(shí)現(xiàn)多線程的幾種方式

方法一,繼承自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方法為線程執(zhí)行體,ThreadExtendsThread對(duì)象即為線程對(duì)象。

方法二,實(shí)現(xiàn)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方法為線程執(zhí)行體,使用時(shí)New一個(gè)Thread對(duì)象,Runnable對(duì)象作為target傳遞給Thread對(duì)象。且同一個(gè)Runnable對(duì)象可作為多個(gè)Thread的target,這些線程均共享Runnable對(duì)象的實(shí)例變量。

方法三,實(shí)現(xiàn)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接口,但比對(duì)方強(qiáng)大,線程執(zhí)行體為call方法,該方法具有返回值和可拋出異常。使用時(shí)將Callable對(duì)象包裝為FutureTask對(duì)象,通過(guò)泛型指定返回值類型。可稍候調(diào)用FutureTask的get方法取回執(zhí)行結(jié)果。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久2 | 国产精品久久久 | 日韩中文字幕在线观看 | 成人不卡视频 | 手机av在线| 免费a视频在线观看 | 成人av在线网 | 国产片在线免费播放 | 成人综合网站 | 欧美日韩久久精品 | 国产一区二区三区免费 | 日韩成人中文字幕 | 狠狠干av| 亚洲精品一区二区三区在线 | 国产一区二区三区在线 | 亚洲一区在线免费观看 | 一级毛片免费完整视频 | 国产精品高清在线观看 | 亚洲在线精品 | 精品专区 | 亚洲激情在线 | 久久精品国产视频 | 国产一二在线 | 亚洲精品91 | 精品国产一区二区三区小蝌蚪 | 高清视频一区 | 中文字幕久久久 | 美女久久久 | 日韩国产欧美亚洲 | 久久久一二三 | 色综合欧美 | 国产视频在线播放 | 久久久久久免费看 | 簧片av | 欧美精品v国产精品v日韩精品 | 精品99免费| 国产高清免费 | 亚洲成人免费在线 | 亚洲久久 | 91精品久久 | 91久久久久久久久久久久久 |