成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

線程池遇到未處理的異常會崩潰嗎?

開發 前端
execute 方法用于提交一個不需要返回值的任務給線程池執行,它接收一個 Runnable 類型的參數,并且不返回任何結果。

首先,這個問題考察的是你對線程池 execute 方法和 submit 方法的理解,在 Java 線程池的使用中,我們可以通過 execute 方法或 submit 方法給線程池添加任務,但如果線程池中的程序在執行時,遇到了未處理的異常會怎么呢?接下來我們一起來看。

1.execute方法

execute 方法用于提交一個不需要返回值的任務給線程池執行,它接收一個 Runnable 類型的參數,并且不返回任何結果。

它的使用示例代碼如下:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExecuteDemo {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);
        
        // 使用 execute 方法提交任務
        executor.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("Task running in " + Thread.currentThread().getName());
                try {
                    // 模擬任務執行
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    System.err.println("Task was interrupted");
                }
                System.out.println("Task finished");
            }
        });

        // 關閉線程池
        executor.shutdown();
    }
}

2.submit方法

submit 方法用于提交一個需要返回值的任務(Callable 對象),或者不需要返回值但希望獲取任務狀態的任務(Runnable 對象,但會返回一個 Future 對象)。

它接收一個 Callable 或 Runnable 類型的參數,并返回一個 Future 對象,通過該對象可以獲取任務的執行結果或檢查任務的狀態。

2.1 提交Callable任務

示例代碼如下:

import java.util.concurrent.Callable;  
import java.util.concurrent.ExecutionException;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
import java.util.concurrent.Future;  
  
public class SubmitCallableDemo {  
    public static void main(String[] args) {  
        // 創建一個固定大小的線程池  
        ExecutorService executorService = Executors.newFixedThreadPool(2);  
  
        // 提交一個 Callable 任務給線程池執行  
        Future<String> future = executorService.submit(new Callable<String>() {  
            @Override  
            public String call() throws Exception {  
                Thread.sleep(2000); // 模擬任務執行時間  
                return "Task's execution result";  
            }  
        });  
  
        try {  
            // 獲取任務的執行結果  
            String result = future.get();  
            System.out.println("Task result: " + result);  
        } catch (InterruptedException | ExecutionException e) {  
            e.printStackTrace();  
        }  
  
        // 關閉線程池  
        executorService.shutdown();  
    }  
}

2.2 提交Runnable任務

提交 Runnable 任務并獲取 Future 對象,示例代碼如下:

import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
import java.util.concurrent.Future;  
  
public class SubmitRunnableDemo {  
    public static void main(String[] args) {  
        // 創建一個固定大小的線程池  
        ExecutorService executorService = Executors.newFixedThreadPool(2);  
  
        // 提交一個 Runnable 任務給線程池執行,并獲取一個 Future 對象  
        Future<?> future = executorService.submit(new Runnable() {  
            @Override  
            public void run() {  
                System.out.println("Task is running in thread: " + Thread.currentThread().getName());  
            }  
        });  
  
        // 檢查任務是否完成(這里只是為了示例,實際使用中可能不需要這樣做)  
        if (future.isDone()) {  
            System.out.println("Task is done");  
        } else {  
            System.out.println("Task is not done yet");  
        }  
  
        // 關閉線程池  
        executorService.shutdown();  
    }  
}

3.遇到未處理異常

線程池遇到未處理的異常執行行為和添加任務的方法有關,也就是說 execute 方法和 submit 方法在遇到未處理的異常時執行行為是不一樣的。

3.1 execute方法遇到未處理異常

示例代碼如下:

import java.util.concurrent.*;

public class ThreadPoolExecutorExceptionTest {
    public static void main(String[] args)  {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                1,
                1,
                1000,
                TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(100));
        // 添加任務一
        executor.execute(() -> {
            String tName = Thread.currentThread().getName();
            System.out.println("線程名:" + tName);
            throw new RuntimeException("拋出異常");
        });
        // 添加任務二
        executor.execute(() -> {
            String tName = Thread.currentThread().getName();
            System.out.println("線程名:" + tName);
            throw new RuntimeException("拋出異常");
        });
    }
}

以上程序的執行結果如下:

圖片圖片

從上述結果可以看出,線程池中的核心和最大線程數都為 1 的情況下,到遇到未處理的異常時,執行任務的線程卻不一樣,這說明了:當使用 execute 方法時,如果遇到未處理的異常,會拋出未捕獲的異常,并將當前線程進行銷毀。

3.2 submit方法遇到未處理異常

然而,當我們將線程池的添加任務方法換成 submit() 之后,執行結果又完全不同了,以下是示例代碼:

import java.util.concurrent.*;

public class ThreadPoolExecutorExceptionTest {
    public static void main(String[] args)  {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                1,
                1,
                1000,
                TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(100));
        // 添加任務一
       Future<?> future = executor.submit(() -> {
            String tName = Thread.currentThread().getName();
            System.out.println("線程名:" + tName);
            throw new RuntimeException("拋出異常");
        });
        // 添加任務二
        Future<?> future2 =executor.submit(() -> {
            String tName = Thread.currentThread().getName();
            System.out.println("線程名:" + tName);
            throw new RuntimeException("拋出異常");
        });
        try {
            future.get();
        } catch (Exception e) {
            System.out.println("遇到異常:"+e.getMessage());
        }
        try {
            future2.get();
        } catch (Exception e) {
            System.out.println("遇到異常:"+e.getMessage());
        }
    }
}

以上程序的執行結果如下:

圖片圖片

從上述結果可以看出,submit 方法遇到未處理的異常時,并將該異常封裝在 Future 的 get 方法中,而不會直接影響執行任務的線程,這樣線程就可以繼續復用了。

小結

線程池在遇到未處理的異常時,不同添加任務的方法的執行行為是不同的:

  • execute 方法:遇到未處理的異常,線程會崩潰,并打印異常信息。
  • submit 方法:遇到未處理的異常,線程本身不會受到影響(線程可以復用),只是將異常信息封裝到返回的對象 Future 中。
責任編輯:武曉燕 來源: 磊哥和Java
相關推薦

2023-10-12 22:35:08

2009-12-25 10:01:23

WinForm程序

2025-02-14 10:13:55

2024-06-28 10:29:18

異常處理Python

2020-07-27 13:49:47

Python編程語言開發

2024-01-08 09:09:40

線程池異常黑洞Futrue

2022-03-23 07:54:05

Java線程池系統

2023-07-27 07:37:47

消息自定義函數

2022-07-04 09:17:37

Flask開源

2025-02-17 00:25:00

Winform開發

2010-04-14 09:20:26

.NET多線程

2024-07-16 08:36:33

線程池父子任務微服務

2020-12-21 06:18:15

Android線程主線程

2025-02-05 14:28:19

2025-05-06 09:32:13

2012-05-15 02:18:31

Java線程池

2023-02-02 08:56:25

線程池線程submit

2024-08-29 08:54:35

2025-01-03 08:40:53

Java并發編程Guava庫

2010-03-26 15:41:39

Python腳本
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产综合久久精品图片 | 日日干干 | 亚洲一区三区在线观看 | 天天久| 日韩一二三区视频 | 久久久久国产一区二区三区 | 黑人精品欧美一区二区蜜桃 | 久久男人| 国产视频久久久 | 九色网址| 欧美日韩不卡 | 亚洲一区自拍 | 99re视频在线 | 亚洲一区二区免费视频 | 成人国产精品久久 | 国产区高清 | 精品一区二区观看 | 免费视频一区二区 | 91精品久久久久久久久中文字幕 | 天天操夜夜艹 | 国产99久久久国产精品 | 久久精品色欧美aⅴ一区二区 | 欧美日韩一区在线观看 | 亚洲3p| 九色视频网站 | 一道本不卡视频 | 免费观看日韩精品 | 国产精品1区2区 | 日本中文字幕一区 | 综合中文字幕 | 中文字幕一区二区三区在线观看 | 欧日韩不卡在线视频 | 国产成人精品一区二区三区四区 | 91精品国产综合久久福利软件 | 国产片侵犯亲女视频播放 | av高清| 在线视频一区二区三区 | 国产二区在线播放 | 久久国产精品免费一区二区三区 | 亚洲一区二区在线播放 | 99久久精品免费看国产四区 |