java 实现超时_如何实现带有超时的Runnable? - java
我目前有一個(gè)相當(dāng)簡(jiǎn)單的SSL服務(wù)器/客戶端項(xiàng)目,其中涉及標(biāo)準(zhǔn)Java后端和Android前端。與客戶端發(fā)送數(shù)據(jù)后,我想嘗試從服務(wù)器讀取響應(yīng)。但是,我遇到了一個(gè)小問(wèn)題。服務(wù)器并不總是響應(yīng),因此我不得不以某種方式嘗試以異步方式獲取響應(yīng)。 (因?yàn)閞ead()方法是一個(gè)阻塞的方法),經(jīng)過(guò)一番混亂之后,我找到了一個(gè)可行的解決方案,但對(duì)我來(lái)說(shuō)似乎很奇怪,就像Im正在做可能“危險(xiǎn)”的事情一樣。
我做的第一件事是創(chuàng)建一個(gè)新的Runnable和Thread對(duì)象:
// "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();
如您所見(jiàn),我在while循環(huán)中使用了一個(gè)布爾“停止”(5秒后設(shè)置為true)作為附加條件。
“ reader.read()”方法是一種阻塞方法,因此,如果服務(wù)器不響應(yīng),那么如果我不實(shí)現(xiàn)某種類型的停止線程,則該方法將阻塞無(wú)限量的時(shí)間。這就是為什么我嘗試使用僅將“ stop”布爾值設(shè)置為true的Timer的原因。
我知道這不是最好的解決方案,有時(shí)我會(huì)重新設(shè)計(jì)整個(gè)事情,但是我仍然想知道我現(xiàn)在正在做的事情是否還可以。當(dāng)然可以,但是可悲的是沒(méi)有任何意義。
參考方案
您是對(duì)的,這種從另外一個(gè)線程開始的方法并不完美。支持這樣的代碼將很困難。
我建議改用線程執(zhí)行器。您的代碼可能如下所示:
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:線程池如何將線程映射到可運(yùn)行對(duì)象 - java
試圖繞過(guò)Java并發(fā)問(wèn)題,并且很難理解線程池,線程以及它們正在執(zhí)行的可運(yùn)行“任務(wù)”之間的關(guān)系。如果我創(chuàng)建一個(gè)有10個(gè)線程的線程池,那么我是否必須將相同的任務(wù)傳遞給池中的每個(gè)線程,或者池化的線程實(shí)際上只是與任務(wù)無(wú)關(guān)的“工人無(wú)人機(jī)”可用于執(zhí)行任何任務(wù)?無(wú)論哪種方式,Executor / ExecutorService如何將正確的任務(wù)分配給正確的線程? 參考方案 …JAVA:字節(jié)碼和二進(jìn)制有什么區(qū)別? - java
java字節(jié)代碼(已編譯的語(yǔ)言,也稱為目標(biāo)代碼)與機(jī)器代碼(當(dāng)前計(jì)算機(jī)的本機(jī)代碼)之間有什么區(qū)別?我讀過(guò)一些書,他們將字節(jié)碼稱為二進(jìn)制指令,但我不知道為什么。 參考方案 字節(jié)碼是獨(dú)立于平臺(tái)的,在Windows中運(yùn)行的編譯器編譯的字節(jié)碼仍將在linux / unix / mac中運(yùn)行。機(jī)器代碼是特定于平臺(tái)的,如果在Windows x86中編譯,則它將僅在Win…java:繼承 - java
有哪些替代繼承的方法? java大神給出的解決方案 有效的Java:偏重于繼承而不是繼承。 (這實(shí)際上也來(lái)自“四人幫”)。他提出的理由是,如果擴(kuò)展類未明確設(shè)計(jì)為繼承,則繼承會(huì)引起很多不正常的副作用。例如,對(duì)super.someMethod()的任何調(diào)用都可以引導(dǎo)您通過(guò)未知代碼的意外路徑。取而代之的是,持有對(duì)本來(lái)應(yīng)該擴(kuò)展的類的引用,然后委托給它。這是與Eric…Java:BigInteger,如何通過(guò)OutputStream編寫它 - java
我想將BigInteger寫入文件。做這個(gè)的最好方式是什么。當(dāng)然,我想從輸入流中讀取(使用程序,而不是人工)。我必須使用ObjectOutputStream還是有更好的方法?目的是使用盡可能少的字節(jié)。謝謝馬丁 參考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是將對(duì)象序列化為八位字節(jié)序列的一種通用方法。但…Java DefaultSslContextFactory密鑰庫(kù)動(dòng)態(tài)更新 - java
我有一個(gè)使用org.restlet.engine.ssl.DefaultSslContextFactory的現(xiàn)有應(yīng)用程序和一個(gè)在服務(wù)器啟動(dòng)時(shí)加載的密鑰庫(kù)文件。我有另一個(gè)應(yīng)用程序,該應(yīng)用程序創(chuàng)建必須添加的證書服務(wù)器運(yùn)行時(shí)動(dòng)態(tài)地更新到密鑰庫(kù)文件。為此,我在代碼中創(chuàng)建了證書和私鑰,然后將其寫入到目錄。該目錄由bash腳本監(jiān)視,該腳本檢查是否有新文件,如果出現(xiàn),它將…
總結(jié)
以上是生活随笔為你收集整理的java 实现超时_如何实现带有超时的Runnable? - java的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 天翼网关 ddns设置_19,微服务网关
- 下一篇: oracle虑重语句,db基本语句(or