Java多線程實現的3種方式

直接繼承Thread類,重寫run方法

package snippet;
public class test {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            new MyThread().start();
        }
    }
}
class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 1; i < 100; i++) {
            System.out.println(getName() + "--->" + i);
        }
    }
}

使用Runable接口+Thread

作為Thread 參數傳入(與上面沒有什么不同,只是為了減少設計的藕性)

package snippet;
public class test {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            new Thread(new MyRunnable()).start();
        }
    }
}
class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 1; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "--->" + i);
        }
    }
}

注意,當實現Runable接口并且覆寫Thread的run方法時,只會調用Thread的run方法.

使用Runable接口

使用Runable接口比較復雜,需要使用到線程池,但是它可以帶返回值

package snippet;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
class MyCallable implements Callable<Integer> {
    
    private int    num1;
    private int    num2;
                
    public MyCallable(int num1, int num2) {
        try {
            this.num1 = num1;
            this.num2 = num2;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public Integer call() throws Exception {
        return num1 + num2;
    }
    
}
public class test {
    public static void main(String[] args) throws Exception {
        ExecutorService pool = Executors.newCachedThreadPool();
        /**
         * 創建一個線程池
         */
        List<Future<Integer>> results = new ArrayList<>();
        /**
         * Future<T>是泛型接口,其中泛型為返回數據類型
         */
        
        for (int i = 0; i < 5; i++) {
            Future<Integer> result = pool.submit(new MyCallable(i, i + 1));
            results.add(result);
        }
        
        for (int i = 0; i < results.size(); i++) {
            System.out.println(results.get(i).get());
        }
        /**
         * 使用get去獲取call方法返回的值,可設置超時. 因為有時候若等待時間太長,則造成體驗不好
         */
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 該文章轉自:http://blog.csdn.net/evankaka/article/details/44153...
    加來依藍閱讀 7,381評論 3 87
  • 寫在前面的話: 這篇博客是我從這里“轉載”的,為什么轉載兩個字加“”呢?因為這絕不是簡單的復制粘貼,我花了五六個小...
    SmartSean閱讀 4,790評論 12 45
  • 本文主要講了java中多線程的使用方法、線程同步、線程數據傳遞、線程狀態及相應的一些線程函數用法、概述等。 首先講...
    李欣陽閱讀 2,493評論 1 15
  • Java多線程學習 [-] 一擴展javalangThread類 二實現javalangRunnable接口 三T...
    影馳閱讀 2,987評論 1 18
  • 與插花相比,我更喜歡盆栽植物。不論身處何方,挪盆培土,只要生命存在、擁有向上的渴望,來年依舊可以,期待花開。[玫瑰...
    雋思閱讀 247評論 0 0