新聞中心
Java開啟多線程的方法有很多,主要包括以下幾種:

創(chuàng)新互聯(lián)是專業(yè)的泌陽網(wǎng)站建設公司,泌陽接單;提供網(wǎng)站建設、成都做網(wǎng)站,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行泌陽網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
1、繼承Thread類
2、實現(xiàn)Runnable接口
3、使用Callable和Future
4、使用線程池(ExecutorService)
下面詳細介紹這四種方法:
1. 繼承Thread類
繼承Thread類是實現(xiàn)多線程的最直接方法,首先創(chuàng)建一個類,繼承自Thread類,然后重寫run()方法,將需要執(zhí)行的任務放在run()方法中,最后創(chuàng)建該類的對象,并調(diào)用start()方法啟動線程。
class MyThread extends Thread {
@Override
public void run() {
// 需要執(zhí)行的任務
}
}
public class Main {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
2. 實現(xiàn)Runnable接口
實現(xiàn)Runnable接口也是實現(xiàn)多線程的一種方法,首先創(chuàng)建一個類,實現(xiàn)Runnable接口,然后重寫run()方法,將需要執(zhí)行的任務放在run()方法中,接著創(chuàng)建該類的對象,將其作為參數(shù)傳遞給Thread類的構(gòu)造函數(shù),最后調(diào)用Thread類對象的start()方法啟動線程。
class MyRunnable implements Runnable {
@Override
public void run() {
// 需要執(zhí)行的任務
}
}
public class Main {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
}
}
3. 使用Callable和Future
Java 5引入了Callable接口和Future接口,可以更方便地實現(xiàn)多線程任務,Callable接口表示一個可以返回結(jié)果的任務,通常與Future接口一起使用,首先創(chuàng)建一個實現(xiàn)Callable接口的類,重寫call()方法,將需要執(zhí)行的任務放在call()方法中,然后創(chuàng)建一個ExecutorService對象,提交Callable任務,最后通過Future對象獲取任務執(zhí)行結(jié)果。
import java.util.concurrent.*; class MyCallable implements Callable{ @Override public Integer call() throws Exception { // 需要執(zhí)行的任務,返回結(jié)果類型為Integer } } public class Main { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); MyCallable myCallable = new MyCallable(); Future future = executorService.submit(myCallable); Integer result = future.get(); // 獲取任務執(zhí)行結(jié)果,如果任務未完成,此方法會阻塞等待任務執(zhí)行完成 executorService.shutdown(); // 關(guān)閉線程池 } }
4. 使用線程池(ExecutorService)
線程池是一種管理線程的機制,可以有效地控制線程的數(shù)量,避免過多或過少的線程導致系統(tǒng)資源浪費,Java提供了ExecutorService接口和Executors工具類來實現(xiàn)線程池,可以使用Executors提供的靜態(tài)方法創(chuàng)建不同類型的線程池,如FixedThreadPool、CachedThreadPool等,將需要執(zhí)行的任務提交給線程池即可。
import java.util.concurrent.*;
class MyRunnable implements Runnable {
@Override
public void run() {
// 需要執(zhí)行的任務
}
}
public class Main {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5); // 創(chuàng)建固定大小的線程池,包含5個線程
MyRunnable myRunnable = new MyRunnable(); // 需要執(zhí)行的任務對象
fixedThreadPool.execute(myRunnable); // 將任務提交給線程池執(zhí)行,如果線程池中的線程數(shù)量小于任務數(shù)量,新任務會被添加到隊列中等待執(zhí)行;如果線程池中的線程數(shù)量大于等于任務數(shù)量,新任務會立即被添加到隊列中等待執(zhí)行,直到有可用線程為止,注意:execute()方法是異步執(zhí)行的,不能保證任務一定會按照指定順序執(zhí)行,如果需要按順序執(zhí)行任務,可以使用FutureTask,fixedThreadPool.shutdown(); // 關(guān)閉線程池,不再接受新的任務,已提交的任務繼續(xù)執(zhí)行直至完成(無論是否正常完成)或超時(超過shutdownAwaitTerminationSeconds參數(shù)指定的時間),然后關(guān)閉所有已提交任務所在的線程,threadPoolExecutor.awaitTermination(60, TimeUnit.SECONDS); // 如果不希望立即關(guān)閉線程池,還可以等待一段時間,讓正在執(zhí)行的任務有足夠的時間完成(非必需),如果在等待時間內(nèi)所有任務都已經(jīng)完成或超時,那么線程池會被關(guān)閉,注意:這種方式并不能保證所有任務都已經(jīng)完成或超時,只是等待一定時間后強制關(guān)閉線程池,如果需要等待所有任務都完成后再關(guān)閉線程池,可以使用invokeAll()方法獲取所有任務的Future對象,然后遍歷這些Future對象,判斷它們是否已經(jīng)完成,如果所有任務都已經(jīng)完成,那么可以安全地關(guān)閉線程池,threadPoolExecutor.shutdownNow(); // 如果需要立即關(guān)閉線程池且不等待正在執(zhí)行的任務完成,可以調(diào)用此方法,它會嘗試停止所有正在執(zhí)行的任務,并返回尚未開始執(zhí)行的任務列表,但是需要注意的是,這種方式可能會導致正在運行的任務被中斷或拋出異常,所以不推薦使用此方法,threadPoolExecutor.shutdownGracefully(); // 如果需要優(yōu)雅地關(guān)閉線程池,可以調(diào)用此方法,它會嘗試停止所有正在執(zhí)行的任務,并等待一段時間以便正在運行的任務有機會完成,如果在等待時間內(nèi)所有任務都已經(jīng)完成或超時,那么線程池會被關(guān)閉;否則,線程池會在剩余時間內(nèi)繼續(xù)接收新任務,如果需要立即關(guān)閉線程池且不等待正在執(zhí)行的任務完成,可以調(diào)用此方法,但是需要注意的是,這種方式可能會導致正在運行的任務被中斷或拋出異常,所以不推薦使用此方法,threadPoolExecutor.awaitTermination(60, TimeUnit.SECONDS); // 如果不希望立即關(guān)閉線程池,還可以等待一段時間,讓正在執(zhí)行的任務有足夠的時間完成(非必需),如果在等待時間內(nèi)所有任務都已經(jīng)完成或超時,那么線程池會被關(guān)閉,注意:這種方式并不能保證所有任務都已經(jīng)完成或超時,只是等待一定時間后強制關(guān)閉線程池,如果需要等待所有任務都完成后再關(guān)閉線程池,可以使用invokeAll()方法獲取所有任務的Future對象,然后遍歷這些Future對象,判斷它們是否已經(jīng)完成,如果所有任務都已經(jīng)完成,那么可以安全地關(guān)閉線程池,threadPoolExecutor.shutdownNow(); // 如果需要立即關(guān)閉線程池且不等待正在執(zhí)行的任務完成,可以調(diào)用此方法,它會嘗試停止所有正在執(zhí)行的任務,并返回尚未開始執(zhí)行的任務列表,但是需要注意的是,這種方式可能會導致正在運行的任務被中斷或拋出異常,所以不推薦使用此方法,threadPoolExecutor.shutdownGracefully(); // 如果需要優(yōu)雅地關(guān)閉線程池,可以調(diào)用此方法,它會嘗試停止所有正在執(zhí)行的任務,并等待一段時間以便正在運行的任務有機會完成,如果在等待時間內(nèi)所有任務都已經(jīng)完成或超時,那么線程池會被關(guān)閉;否則,線程池會在剩余時間內(nèi)繼續(xù)接收新任務,如果需要立即關(guān)閉線程池且不等待正在執(zhí)行的任務完成,可以調(diào)用此方法,但是需要注意的是,這種方式可能會導致正在運行的任務被中斷或拋出異常,所以不推薦使用此方法,threadPoolExecutor.awaitTermination(60, TimeUnit.SECONDS); // 如果不希望立即關(guān)閉線程池,還可以等待一段時間,讓正在執(zhí)行的任務有足夠的時間完成(非必需),如果在等待時間內(nèi)所有任務都已經(jīng)完成或超時
本文題目:java開啟多線程的方法有哪些呢
標題路徑:http://m.fisionsoft.com.cn/article/djdeege.html


咨詢
建站咨詢
