Java併發實戰:Callable+FutureTask實現多執行緒判分彙總
需求分析:
總結自己專案中用到多執行緒的地方,之前一級考試系統,在考生交卷的過程中,需要做很多事情,導致交卷過程很慢。當然不能讓考生一直等待交卷這個過程,於是使用了Callable+FutureTask來優化交卷的速度。下面有優化的虛擬碼,僅供參考。
介紹callable和futuretask:
1.callable
Callable位於java.util.concurrent包下,它也是一個介面,在它裡面也只聲明瞭一個方法call()。一般情況下是配合ExecutorService來使用的,submit方法的引數。
2.futuretask
RunnableFuture繼承了Runnable介面和Future介面,而FutureTask實現了RunnableFuture介面。所以它既可以作為Runnable被執行緒執行,又可以作為Future得到Callable的返回值。FutureTask是Future介面的一個唯一實現類。
程式碼實現:
package test.thread; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; public class testFuture { public static void main(String[] args) { //使用Callable+FutureTask獲取執行結果 //new 一個執行緒池 ExecutorService executor = Executors.newCachedThreadPool(); //開啟3個判分的任務 Task1 task1 = new Task1(); Task2 task2 = new Task2(); Task3 task3 = new Task3(); //把任務放到futuretask中 FutureTask<Integer> futureTask1 = new FutureTask<Integer>(task1); FutureTask<Integer> futureTask2 = new FutureTask<Integer>(task2); FutureTask<Integer> futureTask3 = new FutureTask<Integer>(task3); //1.子執行緒進行計算 執行緒執行 需要一個runable介面,futuretask實現了它 executor.submit(futureTask1); executor.submit(futureTask2); executor.submit(futureTask3); executor.shutdown(); try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); } try { //2.返回結果 futureTask.get() int danxuanti=futureTask1.get(); int panduanti=futureTask2.get(); int zuowenti=futureTask3.get(); int sum=danxuanti+panduanti+zuowenti; System.out.println("單選題子執行緒返回結果,主執行緒計算"+futureTask1.get()); System.out.println("判斷題子執行緒返回結果,主執行緒計算"+futureTask2.get()); System.out.println("作文題子執行緒返回結果,主執行緒計算"+futureTask3.get()); System.out.println("總分"+sum); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } } class Task1 implements Callable<Integer>{ @Override public Integer call() throws Exception { System.out.println("單選題判分中。。。"); Thread.sleep(3000); return 10; } } class Task2 implements Callable<Integer>{ @Override public Integer call() throws Exception { System.out.println("判斷題判分中。。。"); Thread.sleep(3000); return 20; } } class Task3 implements Callable<Integer>{ @Override public Integer call() throws Exception { System.out.println("作文題判分中。。。"); Thread.sleep(3000); return 30; } }
console返回結果
單選題判分中。。。
判斷題判分中。。。
作文題判分中。。。
單選題子執行緒返回結果,主執行緒計算10
判斷題子執行緒返回結果,主執行緒計算20
作文題子執行緒返回結果,主執行緒計算30
總分60
相關推薦
Java併發實戰:Callable+FutureTask實現多執行緒判分彙總
需求分析: 總結自己專案中用到多執行緒的地方,之前一級考試系統,在考生交卷的過程中,需要做很多事情,導致交卷過程很慢。當然不能讓考生一直等待交卷這個過程,於是使用了Callable+FutureTask來優化交卷的速度。下面有優化的虛擬碼,僅供參考。介紹calla
Java多執行緒的實現(程序與執行緒的概念、Java繼承Thread類實現多執行緒、Java實現Runnable介面實現多執行緒、Thread與Runnable的區別、實現Callable介面實現多執行緒)
1 程序與執行緒 1.1 程序與執行緒的概念 什麼是程序? 程序: 作業系統中一個程式的執行週期。(比如我們想要在電腦上登入QQ,從雙擊qq按鈕---->關閉qq這個過程就是一個程序) 多程序: 同一時刻跑多個程式。 在DOS(磁碟作業系統時
Callable+ThreadPoolExecutor實現多執行緒併發並獲得返回值
前言 經常會遇到一些效能問題,比如呼叫某個介面,可能要迴圈呼叫100次,並且需要拿到每一次呼叫的返回結果,通常我們都是放在for迴圈中一次次的序列呼叫,這種方式可想而知道有多慢,那怎麼解決這個問題呢? 多執行緒 為了解決以上問題,我使用的方式是多執行緒。多
JAVA程式設計思想:第14章 多執行緒
第14章 多執行緒利用物件,可將一個程式分割成相互獨立的區域。我們通常也需要將一個程式轉換成多個獨立執行的子任務。象這樣的每個子任務都叫作一個“執行緒”(Thread)。編寫程式時,可將每個執行緒都想象成獨立執行,而且都有自己的專用CPU。一些基礎機制實際會為我們自動分割CP
Java併發(十八):阻塞佇列BlockingQueue BlockingQueue(阻塞佇列)詳解 二叉堆(一)之 圖文解析 和 C語言的實現 多執行緒程式設計:阻塞、併發佇列的使用總結 Java併發程式設計:阻塞佇列 java阻塞佇列 BlockingQueue(阻塞佇列)詳解
阻塞佇列(BlockingQueue)是一個支援兩個附加操作的佇列。 這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。 阻塞佇列常用於生產者和消費者的場景,生產者是往佇列裡新增元素的執行緒,消費者是從佇列裡拿元素的執行緒。阻塞佇列就是生產者
java多執行緒系列(一):Thread、Runnable、Callable實現多執行緒的區別
實現多執行緒 java實現多執行緒的方法有三種,分別是繼承thread類,實現runnable介面,實現callable介面(call方法有返回值) /** * 繼承Thread */ public class MyThread extends Thread{ int a = 0;
Java併發程式設計:Callable、Future和FutureTask
本篇說明的是Callable和Future,它倆很有意思的,一個產生結果,一個拿到結果。 Callable介面類似於Runnable,從名字就可以看出來了,但是Runnable不會返回結果,並且無法丟擲返回結果的異常,而Callable功能更強大一些,被執行緒執
【Java併發程式設計】之六:Runnable和Thread實現多執行緒的區別(含程式碼)
Java中實現多執行緒有兩種方法:繼承Thread類、實現Runnable介面,在程式開發中只要是多執行緒,肯定永遠以實現Runnable介面為主,因為實現Runnable介面相比繼承Th
Java併發程式設計:Callable、Future和FutureTask 獲取返回值
在前面的文章中我們講述了建立執行緒的2種方式,一種是直接繼承Thread,另外一種就是實現Runnable介面。 這2種方式都有一個缺陷就是:在執行完任務之後無法獲取執行結果。 如果需要獲取執行結果,就必須通過共享變數或者使用執行緒通訊的方式來達到效果,這樣使用起來就比較麻煩。
Java併發程式設計:Callable、Future和FutureTask原理解析
返回結果的任務Callable與Future Executor框架使用Runnable作為其基本的任務表示形式。Runnable是一種有很大侷限的抽象,它不能返回一個值或丟擲一個受檢查的異常。Runnable介面: public interface Ru
Java併發程式設計(6):Runnable和Thread實現多執行緒的區別(含程式碼)
Java中實現多執行緒有兩種方法:繼承Thread類、實現Runnable介面,在程式開發中只要是多執行緒,肯定永遠以實現Runnable介面為主,因為實現Runnable介面相比繼承Thread類有如下優勢: 1、可以避免由於Java的單繼承特性而帶來的侷限; 2、增強程式的健壯性,程式碼能夠被多個執行
Java 實現多執行緒Thread Runnable Callable 三種方式
Java 多執行緒 java 實現 多執行緒 三種方法 1. 繼承Thread重寫 run方法。 2.實現Runnable的run方法。無返回值。一個類可以實現多個介面。 3.實現Callable的call方法。有返回值,可以丟擲執行緒錯誤。一個類可以實現多個介面。 public class
Java實現多執行緒之Callable介面
Java實現多執行緒之Callable介面 /* * 一、建立執行執行緒的方式三:實現 Callable 介面。 相較於實現 Runnable 介面的方式,方法可以有返回值,並且可以丟擲異常。 * * 二、執行 Callable 方式,需要 FutureTask 實現類的支援,用
Java併發程式設計:Synchronized及其實現原理
Java併發程式設計系列: 一、Synchronized的基本使用 Synchronized是Java中解決併發問題的一種最常用的方法,也是最簡單的一種方法。Synchronized的作用主要有三個:(1)確保執行緒互斥的訪問同步程式碼(2)保證共享變數的修改能夠及時可見(3)有效解決重排序問題。
Java中Callable實現多執行緒
一、Runnable和Callable< V >原始碼 先回顧一下Runnable和Callable< V >原始碼吧; //Runnable 原始碼 @FunctionalInterface public interface R
Java通過Callable實現多執行緒
import java.util.concurrent.*; import java.util.Date; import java.util.List; import java.util.ArrayLi
Java多執行緒1:為什麼要使用多執行緒——學習方騰飛Java併發程式設計的藝術
為什麼要使用多執行緒 簡單來講,就是為了程式執行的更快 現在,多處理器系統正日益盛行,並且價格不斷降低,即時在低端伺服器和中斷桌面系統中,通常也會採用多個處理器,這種趨勢還在進一步加快,因為通過提高時鐘頻率來提升效能已變得越來越困難,處理器生產廠商都開始轉而在單個晶片
java高併發系列 - 第16天:JUC中等待多執行緒完成的工具類CountDownLatch,必備技能
這是java高併發系列第16篇文章。 本篇內容 介紹CountDownLatch及使用場景 提供幾個示例介紹CountDownLatch的使用 手寫一個並行處理任務的工具類 假如有這樣一個需求,當我們需要解析一個Excel裡多個sheet的資料時,可以考慮使用多執行緒,每個執行緒解析一個sheet裡的資料
如何實現多執行緒?實現多執行緒為什麼要調start,而不是run方法?(繼承Thread類、實現Ruable介面、Callable<V>)
什麼是程序? 作業系統中一個程式的執行週期(從開啟到關閉)。程序是具有一個或多個執行緒的執行緒組。 什麼是執行緒? 一個程序可以同時執行多個任務,任務就是執行緒,一個程序至少有一個執行緒。 執行緒執行在程序內部,執行緒是輕量級程序。 程序和執行緒比較:
Java架構-Spring4+Springmvc+quartz實現多執行緒動態定時排程
scheduler定時排程系統是大多行業專案都需要的,傳統的spring-job模式,個人感覺已經out了,因為存在很多的問題,特別是定時排程的追加、修改、刪除等,需要修改xml,xml的配置生效無非是熱部署灰度釋出方案或者直接停止、重啟伺服器,完全不能做到自動啟動、修復方式。 提醒