Java高頻面試之并發編程-05

hello啊,各位觀眾姥爺們!!!本baby今天來報道了!哈哈哈哈哈嗝🐶

面試官:線程有哪些調度方法?

在Java中,線程的調用方法主要包括以下幾種方式,每種方式適用于不同的場景和需求:


1. 繼承 Thread

通過繼承 Thread 類并重寫 run() 方法,直接調用線程的 start() 方法啟動線程。

實現步驟
class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread running by extending Thread");}
}// 調用方式
public class Main {public static void main(String[] args) {MyThread thread = new MyThread();thread.start(); // 啟動線程,執行run()}
}
特點
  • 優點:簡單直接。
  • 缺點:Java是單繼承,繼承 Thread 后無法繼承其他類。
  • 適用場景:簡單任務,無需共享資源。

2. 實現 Runnable 接口

實現 Runnable 接口,將任務邏輯寫入 run() 方法,然后將實例傳遞給 Thread 對象。

實現步驟
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Thread running by implementing Runnable");}
}// 調用方式
public class Main {public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start();}
}
特點
  • 優點:避免單繼承限制,任務與線程解耦,適合資源共享(如多個線程執行同一任務)。
  • 適用場景:多線程共享同一任務邏輯。

3. 實現 Callable 接口 + Future

通過 Callable 定義帶返回值的任務,結合 ExecutorService 提交任務,并通過 Future 獲取結果。

實現步驟
import java.util.concurrent.*;class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {return "Result from Callable";}
}public class Main {public static void main(String[] args) throws Exception {ExecutorService executor = Executors.newSingleThreadExecutor();Future<String> future = executor.submit(new MyCallable());System.out.println(future.get()); // 阻塞獲取結果executor.shutdown();}
}
特點
  • 優點:支持返回值,可拋出異常。
  • 適用場景:需要異步結果的任務(如計算密集型操作)。

4. 線程池(Executor 框架)

通過線程池管理線程生命周期,避免頻繁創建/銷毀線程的開銷。

實現步驟
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Main {public static void main(String[] args) {// 創建固定大小的線程池ExecutorService executor = Executors.newFixedThreadPool(3);// 提交Runnable任務executor.execute(() -> {System.out.println("Task executed by thread pool");});executor.shutdown(); // 關閉線程池}
}
線程池類型
  • newFixedThreadPool:固定線程數,適用于負載穩定的場景。
  • newCachedThreadPool:線程數自動擴展,適合短時異步任務。
  • newScheduledThreadPool:支持定時或周期性任務。
  • newSingleThreadExecutor:單線程順序執行任務。
特點
  • 優點:資源復用、控制并發數、提供任務隊列。
  • 適用場景:高并發、資源受限的系統。

5. 匿名內部類/Lambda表達式

簡化線程創建的語法,適用于快速實現簡單任務。

實現方式
public class Main {public static void main(String[] args) {// 匿名內部類(Runnable)new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Anonymous Runnable");}}).start();// Lambda表達式(Java 8+)new Thread(() -> System.out.println("Lambda Runnable")).start();}
}
特點
  • 優點:代碼簡潔。
  • 適用場景:快速測試或簡單任務。

6. 定時任務(ScheduledExecutorService

用于執行定時或周期性任務。

實現步驟
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class Main {public static void main(String[] args) {ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);// 延遲1秒后執行scheduler.schedule(() -> System.out.println("Delayed task"), 1, TimeUnit.SECONDS);// 周期性任務(首次延遲2秒,之后每3秒執行一次)scheduler.scheduleAtFixedRate(() -> System.out.println("Periodic task"), 2, 3, TimeUnit.SECONDS);}
}

7. 異步編程(CompletableFuture,Java 8+)

通過鏈式調用處理異步任務,支持回調和非阻塞操作。

實現步驟
import java.util.concurrent.CompletableFuture;public class Main {public static void main(String[] args) {CompletableFuture.supplyAsync(() -> "Async Result").thenAccept(result -> System.out.println(result)).join(); // 等待異步任務完成}
}
特點
  • 優點:支持鏈式調用、異常處理、任務組合。
  • 適用場景:復雜的異步編程需求(如多個異步任務依賴)。

總結與選型建議

方法核心優勢典型場景
繼承 Thread簡單直接快速測試或簡單任務
實現 Runnable解耦任務與線程,支持資源共享多線程共享任務邏輯
實現 Callable支持返回值和異常需要異步結果的計算任務
線程池資源復用,高效管理線程高并發、資源受限的系統
CompletableFuture異步編程,鏈式調用復雜異步任務編排

根據具體需求選擇合適的方法:

  • 簡單任務:直接使用 Runnable + Thread 或 Lambda。
  • 結果依賴:使用 Callable + FutureCompletableFuture
  • 高并發場景:優先使用線程池(如 newFixedThreadPool)。
  • 定時任務:選擇 ScheduledExecutorService

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77935.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77935.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77935.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

進程的同步和互斥

進程同步&#xff08;synchronous&#xff09; ?通俗理解&#xff1a; 就像在排隊買飯&#xff0c;一個一個來&#xff0c;前面的人不走&#xff0c;后面的人就不能干事。 進程同步就是&#xff1a;多個進程之間需要協調&#xff0c;有先后順序&#xff0c;一個進程要等另一…

PDF處理控件Aspose.PDF指南:使用 Python 將 EPUB 轉換為 PDF

EPUB是一種流行的電子書格式&#xff0c;用于可重排內容&#xff0c;而PDF則廣泛用于固定版式文檔&#xff0c;非常適合共享和打印。如果您想使用 Python 將 EPUB 轉換為 PDF&#xff0c;Aspose.PDF for Python 提供了一個簡單可靠的解決方案。在本教程中&#xff0c;我們將向您…

day4-小白學習JAVA---開發軟件_Scanner鍵盤錄入_Random隨機數_流程控制語句

開發軟件_Scanner鍵盤錄入_Random隨機數_流程控制語句 一、開發軟件idea&#xff08;MAC版&#xff09;1、軟件安裝-安裝社區版2、中英文設置3、保存時格式化配置4、注釋和代碼對不齊5、idea快捷鍵 二、鍵盤錄入--Scanner1、next和nextInt2、next和nextLine區別 三、Random隨機…

MySQL基本查詢與數據操作全面解析

目錄 1. CRUD操作概述 2. Create操作詳解 2.1 表的創建 2.2 單行數據插入 2.3 多行數據插入 2.4 插入沖突處理 3. Retrieve操作詳解 3.1 基礎查詢 全列查詢&#xff08;慎用&#xff09; 指定列查詢 表達式查詢 結果去重 3.2 條件查詢&#xff08;WHERE子句&#…

01.Python代碼Pandas是什么?pandas的簡介

01.Python代碼Pandas是什么&#xff1f;pandas的簡介 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是pandas的使用語法。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性&#xff0c;希望對您有用~ pyth…

(8)ECMAScript語法詳解

本系列教程目錄&#xff1a;Vue3Element Plus全套學習筆記-目錄大綱 文章目錄 第2章 ECMAScript2.1 ECMAScript 的發展歷史2.2 什么是ES62.3 ES6語法新特性2.3.1 變量聲明let2.3.2 常量聲明2.3.3 模板字符串2.3.4 函數默認參數2.3.5 箭頭函數2.3.6 對象初始化簡寫2.3.7 解構2.3…

Android JNI開發中頭文件引入的常見問題與解決方案?,提示:file not found

Android JNI開發中頭文件引入的常見問題與解決方案 問題場景&#xff08;新手易犯錯誤&#xff09; 假設你在開發一個JNI項目&#xff0c;想要實現一個線程安全的隊列&#xff08;SafeQueue&#xff09;&#xff0c;于是直接在cpp目錄下創建了safe_queue.h文件&#xff0c;并開…

C++靜態與動態聯編區別解析

在 C++ 中,靜態聯編(Static Binding)和動態聯編(Dynamic Binding)是兩種不同的函數調用綁定機制,核心區別在于確定函數調用的時機和多態性的支持。以下是詳細解釋: 1. 靜態聯編(Static Binding) 定義:在編譯階段確定函數調用與具體實現的關系。特點: 由編譯器直接確…

如何批量為多個 Word 文檔添加水印保護

在日常辦公中&#xff0c;Word文檔添加水印是一項重要的操作&#xff0c;特別是在需要保護文件內容的安全性和版權時。雖然Office自帶了添加水印的功能&#xff0c;但當需要一次性給多個Word文檔添加水印時&#xff0c;手動操作顯得非常繁瑣且低效。為了提高效率&#xff0c;可…

【愚公系列】《Python網絡爬蟲從入門到精通》057-分布式爬取中文日報新聞數據

&#x1f31f;【技術大咖愚公搬代碼&#xff1a;全棧專家的成長之路&#xff0c;你關注的寶藏博主在這里&#xff01;】&#x1f31f; &#x1f4e3;開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主&#xff01; &#x1f…

Linux系統編程 day9 SIGCHLD and 線程

SIGCHLD信號 只要子進程信號發生改變&#xff0c;就會產生SIGCHLD信號。 借助SIGCHLD信號回收子進程 回收子進程只跟父進程有關。如果不使用循環回收多個子進程&#xff0c;會產生多個僵尸進程&#xff0c;原因是因為這個信號不會循環等待。 #include<stdio.h> #incl…

微信小程序拖拽排序有效果圖

效果圖 .wxml <view class"container" style"--w:{{w}}px;" wx:if"{{location.length}}"><view class"container-item" wx:for"{{list}}" wx:key"index" data-index"{{index}}"style"--…

hadoop三大組件的結構及各自的作用

1 HDFS 1.1功能 HDFS 是 Hadoop 的分布式文件系統&#xff0c;用于存儲和管理海量數據。它具有高容錯性、高吞吐量和可擴展性&#xff0c;能夠在多個節點上存儲和管理大規模數據 1.2架構&#xff1a;采用主從架構&#xff0c;由一個 NameNode 和多個 DataNode 組成。NameNode…

解決jupyter notebook修改路徑下沒有c.NotebookApp.notebook_dir【建議收藏】

文章目錄 一、檢查并解決問題二、重新設置默認路徑創作不易&#xff0c;感謝未來首富們的支持與關注&#xff01; 最近在用jupyter notebook編寫代碼時&#xff0c;更新了一下Scikit-learn的版本&#xff0c;然后重新打開jupyter notebook的時候&#xff0c;我傻眼了&#xff0…

MCP Host、MCP Client、MCP Server全流程實戰

目錄 準備工作 MCP Server 實現 調試工作 MCP Client 實現 MCP Host 配置 第一步:配置支持 function calling的 LLM 第二步:添加MCP Server 一般有兩種方式,第一種json配置,第二種直接是Command形式,我這里采用Command形式 第三步:使用MCP Server 準備工作 安裝…

4.21—4.22學習總結 JavaWeb:HTML-CSS

Web&#xff1a;能夠通過瀏覽器訪問到的網站。 Web標準&#xff1a; HTML&#xff1a; vscode中進行注釋的快捷鍵為ctrl斜線/ h1的字體最大&#xff0c;依次遞減&#xff0c;只存在h1—h6。 超鏈接&#xff1a; 設置字體顏色&#xff1a; 方式三寫一個css文件&#xff0c;將方…

Kaamel Agent: 基于EU AI Act的AI影響評估(AIIA)

1. 引言&#xff1a;安全視角下的AI監管 隨著人工智能技術的快速發展和廣泛應用&#xff0c;AI系統在為社會帶來創新和效率的同時&#xff0c;也引發了諸多關于安全、隱私和合規的擔憂。在這一背景下&#xff0c;全球范圍內涌現出多種監管框架和標準&#xff0c;旨在確保AI系統…

Mongodb分布式文件存儲數據庫

文章目錄 一、MongoDB 簡介基本信息特點內部組件 二、MongoDB 部署1. 安裝依賴2. 解壓部署并配置環境變量3. 修改配置文件以及啟動服務4.數據庫權限管理 三、MongoDB 管理1. 角色權限2. 操作命令用戶管理命令常用命令&#xff08;Mongo4.2.8&#xff09;數據庫相關用戶相關集合…

麒麟V10安裝MySQL8.4

1、下載安裝包 wget https://cdn.mysql.com//Downloads/MySQL-8.4/mysql-8.4.5-1.el7.x86_64.rpm-bundle.tar2、解壓 mkdir -p /opt/mysql tar -xvf mysql-8.4.5-1.el7.x86_64.rpm-bundle.tar -C /opt/mysql3、安裝MySQL 3.1、卸載mariadb rpm -qa | grep mariadb rpm -e m…

Unreal如何使用后處理材質實現一個黑屏漸變效果

文章目錄 前言相機后期處理材質創建材質相機設置動態修改FadeAlpha參數使用示例最后前言 UE5 開發VR ,如何通過PostProcess輕松實現黑屏漸變效果 最簡單的辦法,其實是使用一個半球形模型,遮擋住相機,然后控制這個半球形遮罩的顏色透明度,至少Unity中默認的Tunneling是這么…