1. 程式人生 > >Java併發實戰:Callable+FutureTask實現多執行緒判分彙總

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)有效解決重排序問題。

JavaCallable實現執行

一、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的配置生效無非是熱部署灰度釋出方案或者直接停止、重啟伺服器,完全不能做到自動啟動、修復方式。 提醒