1. 程式人生 > >執行緒池ThreadPoolExecutor的submit方法

執行緒池ThreadPoolExecutor的submit方法

   <T> Future<T> submit(Callable<T> task);

   <T> Future<T> submit(Runnable task, T result);

    Future<?> submit(Runnable task);

三個過載方法,第一個很好理解,傳入callable,本身call函式就有一個返回值,可以正常取得。

第二個第三個就不清楚怎麼可以取到返回值了,因為Runnable本身的run方法也沒有返回值,為什麼要這麼做,如果沒有返回值,直接用execute方法就好,為什麼還要下面這幾個submit方法呢。

package thread.pool;

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

public class PoolTest {
    public static void main(String[] args) {
		ExecutorService executor = Executors.newFixedThreadPool(3);
		Future<?> submit = executor.submit(new Runnable(){

			@Override
			public void run() {
				System.out.println("hehe");				
			}			
		});
		try {
			System.out.println(submit.get());
		} catch (Exception e) {
			
		}
	}
}
輸出:
hehe
null
submit提交的任務,正常執行,返回的是null,不清楚有什麼意義
package thread.pool;

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

public class PoolTest {
    public static void main(String[] args) {
		ExecutorService executor = Executors.newFixedThreadPool(3);
		Future<?> submit = executor.submit(new Runnable(){

			@Override
			public void run() {
				System.out.println("how");
				throw new RuntimeException("hehe");				
			}			
		});
		try {
			Object obj = submit.get();
			System.out.println(obj);
		} catch (Exception e) {
			
			System.out.println(e.getMessage() + "  exception");
			
		}
	}
}
how
java.lang.RuntimeException: hehe  exception
任務裡丟擲異常,返回值可以get到該異常,繼續丟擲,不懂。
package thread.pool;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

public class PoolTest {
    public static void main(String[] args) {
		ExecutorService executor = Executors.newFixedThreadPool(3);
		FutureTask<String> ft = new FutureTask<String>(new Callable<String>(){

			@Override
			public String call() throws Exception {
				
				return "hehe";
			}
			
		});
		Future<?> submit = executor.submit(ft);
		try {
			;
			System.out.println("1" + submit.get());
			System.out.println("2" + ft.get());
		} catch (Exception e) {
			
			System.out.println(e.getMessage() + "  exception");
			
		}
		executor.shutdown();
	}
   
}
輸出:
1null
2hehe

package thread.pool;

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

public class PoolTest {
	static String aa = "he";
    public static void main(String[] args) {
		ExecutorService executor = Executors.newFixedThreadPool(3);
		
		Future<?> submit = executor.submit(new Runnable(){

			@Override
			public void run() {
				System.out.println("how");
				aa = aa + "he";			
			}			
		},aa);
		try {
			System.out.println(submit.get());
		} catch (Exception e) {
			
		}
	}
}
輸出:
how
he

結論:終於還是沒搞懂,這兩個函式的使用場景是什麼。

覺得應該是:

execute提交runnable執行就好

submit提交callable,取得返回值就好

為什麼要submit提交runnable呢


相關推薦

Java執行ExecutorService方法詳解

執行緒在專案中有時候是很重要的一部分,對於那些不需要返回結果只需呼叫而且執行之間較長的方法,可考慮用執行緒實現。但是執行緒的頻繁建立和銷燬會降低系統的效能,因此多執行緒情況下最好要考慮執行緒池技術。 執行緒池的多種建立方式下一節介紹。 建立執行緒池方式: //建立可快

Java中Executors類中幾種建立各型別執行方法及例項

Executors:提供了一系列靜態工廠方法用於建立各種執行緒池。 1.Executors.newCachedThreadPool建立可變執行緒池 如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。核心執行緒池大小為0,最大為Integer.MA

Java四種執行使用方法

1.new Thread的弊端執行一個非同步任務你還只是如下new Thread嗎?1234567new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stub

Java執行execute()方法原始碼解析

先看作者給出的註釋來理解執行緒池到底有什麼作用 * Thread pools address two different problems: they usually* provide improved performance when executing large nu

你不知道的執行構造方法的那些趣事?

(手機橫屏看原始碼更方便) 注:java原始碼分析部分如無特殊說明均基於 java8 版本。 簡介 ThreadPoolExecutor的構造方法是建立執行緒池的入口,雖然比較簡單,但是資訊量很大,由此也能引發一系列的問題,同樣地,這也是面試中經常被問到的問題,下面彤哥只是列舉了一部分關於ThreadP

執行踩坑 - 作為例項成員或方法區域性變數的誤區

轉自 https://blog.csdn.net/firefile/article/details/80747569 本文目錄: 概述 驗證 剖析 小結 概述 執行緒池可以把執行緒複用起來,減少執行緒建立銷燬的時間和資源消耗,提高了程式任務執

java併發程式設計--Executor框架以及Executors類的建立執行方法

       Eexecutor作為靈活且強大的非同步執行框架,其支援多種不同型別的任務執行策略,提供了一種標準的方法將任務的提交過程和執行過程解耦開發,基於生產者-消費者模式,其提交任務的執行緒相當於生產者,執行任務的執行緒相當於消費者,並用Runnab

執行submit和execute方法區別(類似callable和runnable)

執行緒池中的execute方法大家都不陌生,即開啟執行緒執行池中的任務。還有一個方法submit也可以做到,它的功能是提交指定的任務去執行並且返回Future物件,即執行的結果。下面簡要介紹一下兩者的三個區別: 1、接收的引數不一樣 2、submit有返回值,而execute沒有 用到返

Junit單元測試+aop+spring+執行,在進行Junit測試時切面中執行內呼叫的方法執行

一、問題背景: 寫了一個切面,指向某service包下的所有類及方法,當該service包下方法被呼叫時切面執行,切面中用了執行緒池ExecutorService pool = Executors.newFixedThreadPool(5);執行緒池內呼叫了dao層的方法。 二、問題描述:單

執行實現執行的建立 的兩種方法

package cn.itcast.demo5; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /* JDK1.5新特性,實現執行緒池程式 使用

Java多執行-執行ThreadPoolExecutor構造方法和規則 Java多執行-執行ThreadPoolExecutor構造方法和規則

Java多執行緒-執行緒池ThreadPoolExecutor構造方法和規則 2017年05月03日 17:15:37 閱讀數:40542 為什麼用執行緒池 部落格地址 http://blog.csdn.ne

執行 技術點 目錄 1. 執行作用: 提升效能 1 2. 使用流程 1 3. 執行執行的監控 jvisual 1 4. 執行常用方法 2 5. 執行相關概念 2 5.1. 佇列

 池與執行緒池 技術點   目錄 1. 執行緒池作用:  提升效能 1 2. 使用流程 1 3. 執行緒與執行緒池的監控  jvisual 1 4. 執行緒常用方法 2 5. 執行緒池相關概念 2 5.1. 佇列 &n

​​​​​​​ThreadPoolExecutor執行之submit方法

jdk1.7.0_79    在上一篇《ThreadPoolExecutor執行緒池原理及其execute方法》中提到了執行緒池ThreadPoolExecutor的原理以及它的execute方法。本文解析ThreadPoolExecutor#submit。   

Java多執行-執行ThreadPoolExecutor構造方法和規則

為什麼用執行緒池 有時候,系統需要處理非常多的執行時間很短的請求,如果每一個請求都開啟一個新執行緒的話,系統就要不斷的進行執行緒的建立和銷燬,有時花在建立和銷燬執行緒上的時間會比執行緒真正執行的時間還長。而且當執行緒數量太多時,系統不一定能受得了。 使用執

深入理解Java執行(1):ThreadPoolExecutor整體流程梳理,建立worker相關方法

執行緒池作為一個執行緒的容器,主要的作用就是防止頻繁建立執行緒,節省時間資源和cpu資源。雖然一定程度上佔用了記憶體,但實際情況下利遠遠大於弊。 構造方法 public ThreadPoolExecutor( int corePoolSize, //核

Java定時任務的幾種方法(Thread 和 Timer,執行

/**   * 普通thread   * 這是最常見的,建立一個thread,然後讓它在while迴圈裡一直執行著,   * 通過sleep方法來達到定時任務的效果。這樣可以快速簡單的實現,程式碼如

-1-5 java 多執行緒 概念 程序 執行緒區別聯絡 java建立執行緒方式 執行緒執行緒池概念 執行緒安全 同步 同步程式碼塊 Lock鎖 sleep()和wait()方法的區別 為什麼wait(),notify(),notifyAll()等方法都定義在O

 本文關鍵詞: java 多執行緒 概念 程序 執行緒區別聯絡 java建立執行緒方式 執行緒組 執行緒池概念 執行緒安全 同步 同步程式碼塊 Lock鎖  sleep()和wait()方法的區別 為什麼wait(),notify(),notifyAll()等方法都定義在Object類中 多執行緒

使用C++11實現執行的兩種方法

概述:什麼是執行緒池?    因為程式邊執行邊建立執行緒是比較耗時的,所以我們通過池化的思想:在程式開始執行前建立多個執行緒,這樣,程式在執行時,只需要從執行緒池中拿來用就可以了.大大提高了程式執行效率. 如何實現:    一般執行緒池都會有以下幾個部分構成: 1. 執行

Java 多執行ThreadPoolExecutor解析及Executors類中提供的靜態方法來建立執行

上面的程式碼可能看起來不是那麼容易理解,下面我們一句一句解釋:   首先,判斷提交的任務command是否為null,若是null,則丟擲空指標異常;   接著是這句,這句要好好理解一下: if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(c

Java執行(2)——執行中的幾個重要方法詳解

【內容摘要】 在java中,如果需要進行多執行緒程式設計,可以採用java自帶的執行緒池來實現,執行緒池對於我們新手來說是一個非常好的選擇,因為我們可以不用關心執行緒池中執行緒是如何排程的,避免在多執行緒程式設計過程產生死鎖等問題。在瞭解執行緒池的使用前,本文