Java 實現(xiàn)多線程的幾種方式匯總
我們先來看段示例代碼
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(); // } // } //方法二:實現(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(); // } // } //方法三:實現(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(); } } }
接下來我們來詳細探討下Java 實現(xiàn)多線程的幾種方式
方法一,繼承自Thread
public class ThreadExtendsThread extends Thread { private int i; @Override public void run() { for(; i < 100; i++) { System.out.println(getName() + " " + i); } } }
run方法為線程執(zhí)行體,ThreadExtendsThread對象即為線程對象。
方法二,實現(xiàn)Runnable接口
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í)行體,使用時New一個Thread對象,Runnable對象作為target傳遞給Thread對象。且同一個Runnable對象可作為多個Thread的target,這些線程均共享Runnable對象的實例變量。
方法三,實現(xiàn)Callable接口
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接口,但比對方強大,線程執(zhí)行體為call方法,該方法具有返回值和可拋出異常。使用時將Callable對象包裝為FutureTask對象,通過泛型指定返回值類型??缮院蛘{(diào)用FutureTask的get方法取回執(zhí)行結(jié)果。
相關(guān)文章
Spring Security基于json登錄實現(xiàn)過程詳解
這篇文章主要介紹了Spring Security基于json登錄實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08mybatis中foreach報錯:_frch_item_0 not found的解決方法
這篇文章主要給大家介紹了mybatis中foreach報錯:_frch_item_0 not found的解決方法,文章通過示例代碼介紹了詳細的解決方法,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-06-06Mybatis中的游標(biāo)查詢Cursor(滾動查詢)
這篇文章主要介紹了Mybatis中的游標(biāo)查詢Cursor(滾動查詢),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Fluent Mybatis如何做到代碼邏輯和sql邏輯的合一
對比原生Mybatis, Mybatis Plus或者其他框架,F(xiàn)luentMybatis提供了哪些便利呢?很多朋友對這一問題不是很清楚,今天小編給大家?guī)硪黄坛剃P(guān)于Fluent Mybatis如何做到代碼邏輯和sql邏輯的合一,一起看看吧2021-08-08Java導(dǎo)出excel時合并同一列中相同內(nèi)容的行思路詳解
這篇文章主要介紹了Java導(dǎo)出excel時合并同一列中相同內(nèi)容的行,需要的朋友可以參考下2018-06-06IDEA 單元測試報錯:Class not found:xxxx springb
這篇文章主要介紹了IDEA 單元測試報錯:Class not found:xxxx springboot的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Java設(shè)計模式之策略模式(Strategy模式)介紹
這篇文章主要介紹了Java設(shè)計模式之策略模式(Strategy模式)介紹,Strategy是屬于設(shè)計模式中對象行為型模式,要是定義一系列的算法,這些算法一個個封裝成單獨的類,需要的朋友可以參考下2015-03-03java鏈?zhǔn)絼?chuàng)建json對象的實現(xiàn)
本文主要介紹了java中如何通過最簡單的方式實現(xiàn)鏈?zhǔn)絼?chuàng)建json對象,解決創(chuàng)建json代碼臃腫的問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02