1. 程式人生 > >通過FutureTask來實現阻塞當前執行緒等待其他執行緒處理的結果

通過FutureTask來實現阻塞當前執行緒等待其他執行緒處理的結果

最近在開發中遇到一個這樣的需求,如:定義一個介面給第三方呼叫,方法返回的結果需要通過非同步任務返回。我們可以利用FutureTask很輕鬆的實現,還是直接上程式碼吧。

先自定義一個FutureTask

private static class PassFuture<V> extends FutureTask<V> {

        public PassFuture() {
            super(new Callable<V>() {
                @Override
                public
V call() throws Exception { throw new IllegalStateException( "this should never be called"); } }); } public void setResult(V v) { set(v); } }

接下來就可以利用PassFuture的setResult方法和get方法得到結果。

public static String waitAndGetInfo() {
        final PassFuture<String> future = new PassFuture<String>();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                future.setResult("process done."
); } }).start(); try { return future.get(timeout, TimeUnit.MILLISECONDS); } catch (Exception e) { e.printStackTrace(); } return null; }

希望大家提點建議,提供更好的辦法。

相關推薦

通過FutureTask實現阻塞當前執行等待其他執行處理結果

最近在開發中遇到一個這樣的需求,如:定義一個介面給第三方呼叫,方法返回的結果需要通過非同步任務返回。我們可以利用FutureTask很輕鬆的實現,還是直接上程式碼吧。 先自定義一個FutureTask: private static class Pass

python中多執行的共享資料,通過queue實現,內有生產者消費者經典模型的示例程式碼

queue:佇列,即先進先出,它有以下幾個方法: 1.判斷佇列的大小:size() 2.向佇列中新增:put() 3.向佇列中取出:get() 4.如果佇列規定了長度,用來判斷是否滿了:full() import threading,time import queu

第一個 spring Boot 應用通過Docker 實現構建、執行、釋出

1. Docker 簡介 Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。Docker image 是

通過編碼實現軟件界面

hao123 ongl com roi aid music .com 編碼 list %E5%85%B3%E4%BA%8EaNDROID%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E8%AF%84%E8%AE%BA http://music.h

Java開發中,通過sql實現過濾以及分頁

  我們通過一個需求來引入問題。 首先,簡單介紹一下需求:實現一個下圖的頁面,包含了過濾以及分頁。資料是後臺資料庫獲得到的。 那麼關於如何實現過濾以及分頁,考慮到通過前臺實現或者後臺實現,我們不妨來分析一下兩種方法。 首先,前臺實現:無非就是後臺獲取所有的list,傳

[那些年踩過的坑]pdf轉換為圖片的教程(pdf的Base64轉換為圖片的base64和自己不通過第三方實現pdf轉圖片的Dome)

  因為工作需要,要把PDF的64字串轉換為圖片的base64儲存到資料庫,但是看了看國內外,一方面是做這個的比較少,還有就是做這個真的很煩.   PDF轉圖片呢,大概的實現思路方式一般有兩種,一種就是重繪,類似於畫畫,把看到的畫到新的畫布上;第二種呢,就會識別裡面的內容複製到新的畫布上,我也不知道我比喻準

Java實現執行等待執行join,CountDownLatch

本文介紹兩種主執行緒等待子執行緒的實現方式,以5個子執行緒來說明: 1、使用Thread的join()方法,join()方法會阻塞主執行緒繼續向下執行。 2、使用Java.util.concurrent中的CountDownLatch,是一個倒數計數器。初始化時先設定

Java通過Socket實現簡單多人聊天室

Socket可以實現網路上兩個程式通過雙向通道進行資料的交換,此外它是Java中網路TCP/IP協議的封裝,例如可以進行網路通訊等等,下面我們就來簡單寫一下多人聊天室。 首先來分析一下要實現的流程 首先建立一個伺服器端,構建ServerSocket並繫結埠 建立sock

通過jsonp實現跨域訪問獲取資料!!!

通過jsonp來實現跨域訪問獲取資料的原理是什麼?通俗一點就是通過<script src="你要訪問的連結" type="text/javascript"></script>中的src來訪問你想要獲取資料的網址,並獲取資料。(不要問這啥這樣做就可以,

python之通過thread實現多程序

程式碼如下: import threading, time class Test1(threading.Thread): def __init__(self, name): super().__init__(name=name) def run(self): print('tes

javaweb通過介面實現多個檔案壓縮和下載(包括單檔案下載,多檔案批量下載)

  程式設計師在做web等專案的時候,往往都需要新增檔案上傳、下載、刪除的功能,有時是單檔案,有時多檔案批量 操作,而這些功能的程式碼程式設計師可以自己收藏起來當成工具使用,這樣,程式設計師在進行程式設計的時候就會事半功倍 了,那麼接下來的部落格將會介紹各個框架的檔案上傳和下

通過繼承實現註解方式的屬性注入

要使用註解來注入屬性,首先就要定義一個註解,註解的定義如下: package everyworkdayprogramming._2015_1_23; import java.lang.annotat

Android 2個Service實現相互保活,通過bindservice實現,不通過廣播實現

1,實現原理:啟動2個Service,相互繫結監聽,當A Service監聽到連線斷開的時候,說明B服務可能被 Kill掉了,這時需要重新開啟A服務,同樣B服務的監聽斷掉了,重新啟動A服務。A,B兩個服務都是單獨的程序,需要使用AIDL來通訊。 2,A服務原始碼: public class

--Listener (三)使用Listener實現顯示當前線上人數

主要的思路是:每當使用者第一次訪問web應用的時候都會建立一個session來跟蹤會話,可以監聽session的變化來記錄當前線上的人數。每當建立session的時候,人數+1,當session銷燬的時候,人數減1(在application(servletCon

在安卓中,怎麼通過ViewPager實現輪播圖的效果?

           //currentPage是一個角標,通過viewPager中的條目獲取當前頁面的角標,假如條目是6,因為%list.size,那麼當前頁面的角標就是0.int currentPage = viewPager.getCurrentItem()%list.size();  //把當前頁面的

通過transform實現的2D/3D的轉換

.box>div{ width: 300px; height:150px; border: 1px solid #000; background-color: red; float: left; margin-right: 30px; } div:nth-child(2){ backgr

OpenCV通過MASK實現摳圖

 // masktest.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <opencv2/core/core.hpp> #include "opencv2/imgproc/imgproc.h

Android studio 通過AIDL實現加法運算

1:首先滑鼠右鍵點選專案新建AIDL Folder 2:在 aidl檔案右鍵新建AIDL File 3:刪除 或者無視裡面的內容,並寫下如下程式碼,並Rebuild project。 package com.dt.aidltest; int

oracle中怎樣排除重複記錄--通過distinct實現

distinct這個關鍵字來過濾掉多餘的重複記錄只保留一條,但往往只用 它來返回不重複記錄的條數,而不是用它來返回不重記錄的所有值。其原因是distinct只有用二重迴圈查詢來解決,而這樣對於一個數據量非常大的站來說,無疑是會直接影響到效率的。 下面先來看看例子: tabl

阿里雲 雲虛擬主機通過CDN實現https?

為什麼要用CDN來實現https? 因為阿里雲的雲虛擬主機不支援遠端連線,所以即使有SSL也無法配置,所以才需要CDN來實現。如果你有錢可以買臺獨立的伺服器,當然伺服器的價格如果有了解的朋友應該會知道,如果是自己來用的話犯不上去花那麼多錢,而通過CDN只需25