java 实现超时_如何实现带有超时的Runnable? - java
我目前有一個相當簡單的SSL服務器/客戶端項目,其中涉及標準Java后端和Android前端。與客戶端發送數據后,我想嘗試從服務器讀取響應。但是,我遇到了一個小問題。服務器并不總是響應,因此我不得不以某種方式嘗試以異步方式獲取響應。 (因為read()方法是一個阻塞的方法),經過一番混亂之后,我找到了一個可行的解決方案,但對我來說似乎很奇怪,就像Im正在做可能“危險”的事情一樣。
我做的第一件事是創建一個新的Runnable和Thread對象:
// "reader" is of type "BufferedReader"
Runnable receiveResponse = new Runnable() {
boolean stop = false;
@Override
public void run() {
try {
new Timer().schedule(new TimerTask() {
@Override
public void run() {
stop = true;
}
}, 5000);
char receive;
StringBuilder responseBuilder = new StringBuilder();
while (!stop && ((receive = (char) reader.read()) != END_OF_STREAM_CHAR)) {
responseBuilder.append(receive);
}
// If the server responds in time I can continue processing the response etc.
} catch (Exception ex) {
// Handle exception ...
}
}
};
Thread thread = new Thread(receiveResponse);
thread.start();
如您所見,我在while循環中使用了一個布爾“停止”(5秒后設置為true)作為附加條件。
“ reader.read()”方法是一種阻塞方法,因此,如果服務器不響應,那么如果我不實現某種類型的停止線程,則該方法將阻塞無限量的時間。這就是為什么我嘗試使用僅將“ stop”布爾值設置為true的Timer的原因。
我知道這不是最好的解決方案,有時我會重新設計整個事情,但是我仍然想知道我現在正在做的事情是否還可以。當然可以,但是可悲的是沒有任何意義。
參考方案
您是對的,這種從另外一個線程開始的方法并不完美。支持這樣的代碼將很困難。
我建議改用線程執行器。您的代碼可能如下所示:
Runnable receiveResponse = new Runnable() {
...
};
ExecutorService executor = Executors.newSingleThreadExecutor();
Future> future = executor.submit(receiveResponse);
try {
Object result = future.get(5000, TimeUnit.MILLISECONDS);
System.out.println("Completed successfully");
} catch (InterruptedException e) {
...
} catch (ExecutionException e) {
...
} catch (TimeoutException e) {
System.out.println("Timed out. Cancelling the runnable...");
future.cancel(true);
}
executor.shutdown();
Java:線程池如何將線程映射到可運行對象 - java
試圖繞過Java并發問題,并且很難理解線程池,線程以及它們正在執行的可運行“任務”之間的關系。如果我創建一個有10個線程的線程池,那么我是否必須將相同的任務傳遞給池中的每個線程,或者池化的線程實際上只是與任務無關的“工人無人機”可用于執行任何任務?無論哪種方式,Executor / ExecutorService如何將正確的任務分配給正確的線程? 參考方案 …JAVA:字節碼和二進制有什么區別? - java
java字節代碼(已編譯的語言,也稱為目標代碼)與機器代碼(當前計算機的本機代碼)之間有什么區別?我讀過一些書,他們將字節碼稱為二進制指令,但我不知道為什么。 參考方案 字節碼是獨立于平臺的,在Windows中運行的編譯器編譯的字節碼仍將在linux / unix / mac中運行。機器代碼是特定于平臺的,如果在Windows x86中編譯,則它將僅在Win…java:繼承 - java
有哪些替代繼承的方法? java大神給出的解決方案 有效的Java:偏重于繼承而不是繼承。 (這實際上也來自“四人幫”)。他提出的理由是,如果擴展類未明確設計為繼承,則繼承會引起很多不正常的副作用。例如,對super.someMethod()的任何調用都可以引導您通過未知代碼的意外路徑。取而代之的是,持有對本來應該擴展的類的引用,然后委托給它。這是與Eric…Java:BigInteger,如何通過OutputStream編寫它 - java
我想將BigInteger寫入文件。做這個的最好方式是什么。當然,我想從輸入流中讀取(使用程序,而不是人工)。我必須使用ObjectOutputStream還是有更好的方法?目的是使用盡可能少的字節。謝謝馬丁 參考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是將對象序列化為八位字節序列的一種通用方法。但…Java DefaultSslContextFactory密鑰庫動態更新 - java
我有一個使用org.restlet.engine.ssl.DefaultSslContextFactory的現有應用程序和一個在服務器啟動時加載的密鑰庫文件。我有另一個應用程序,該應用程序創建必須添加的證書服務器運行時動態地更新到密鑰庫文件。為此,我在代碼中創建了證書和私鑰,然后將其寫入到目錄。該目錄由bash腳本監視,該腳本檢查是否有新文件,如果出現,它將…
總結
以上是生活随笔為你收集整理的java 实现超时_如何实现带有超时的Runnable? - java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天翼网关 ddns设置_19,微服务网关
- 下一篇: oracle虑重语句,db基本语句(or