Simple timeout en java
est-ce que quelqu'un peut me guider sur la façon dont je peux utiliser un timeout simple en java? Fondamentalement, dans mon projet, j'exécute une instruction br.readLine()
, qui est la lecture d'une réponse d'un modem. Mais parfois, le modem ne répond pas. À cette fin, je veux ajouter un délai d'attente.
Je cherche un code comme:
try {
String s= br.readLine();
} catch(TimeoutException e) {
System.out.println("Time out has occurred");
}
20
demandé sur
Chad Ferguson
2013-10-18 22:08:27
3 réponses
ce que vous recherchez peut être trouvé ici . Il existe peut-être une façon plus élégante d'y parvenir, mais une approche possible est
Option 1 (préférée):
final Duration timeout = Duration.ofSeconds(30);
ExecutorService executor = Executors.newSingleThreadExecutor();
final Future<String> handler = executor.submit(new Callable() {
@Override
public String call() throws Exception {
return requestDataFromModem();
}
});
try {
handler.get(timeout.toMillis(), TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
handler.cancel(true);
}
executor.shutdownNow();
Option 2:
final Duration timeout = Duration.ofSeconds(30);
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
final Future<String> handler = executor.submit(new Callable() {
@Override
public String call() throws Exception {
return requestDataFromModem();
}
});
executor.schedule(new Runnable() {
@Override
public void run(){
handler.cancel(true);
}
}, timeout.toMillis(), TimeUnit.MILLISECONDS);
executor.shutdownNow();
ce n'est qu'une ébauche pour que vous puissiez avoir l'idée principale.
25
répondu
Trein
2018-01-12 15:54:52
L'exemple 1 ne compilera pas. Cette version compile et exécute. Il utilise les caractéristiques lambda pour l'abréger.
/*
* [RollYourOwnTimeouts.java]
*
* Summary: How to roll your own timeouts.
*
* Copyright: (c) 2016 Roedy Green, Canadian Mind Products, http://mindprod.com
*
* Licence: This software may be copied and used freely for any purpose but military.
* http://mindprod.com/contact/nonmil.html
*
* Requires: JDK 1.8+
*
* Created with: JetBrains IntelliJ IDEA IDE http://www.jetbrains.com/idea/
*
* Version History:
* 1.0 2016-06-28 initial version
*/
package com.mindprod.example;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import static java.lang.System.*;
/**
* How to roll your own timeouts.
* Based on code at /q/simple-timeout-in-java-13906/"result: " + result );
}
catch ( TimeoutException e )
{
err.println( "task timed out" );
future.cancel( true /* mayInterruptIfRunning */ );
}
catch ( InterruptedException e )
{
err.println( "task interrupted" );
}
catch ( ExecutionException e )
{
err.println( "task aborted" );
}
executor.shutdownNow();
}
/**
* dummy method to read some data from a website
*/
private static String requestDataFromWebsite()
{
try
{
// force timeout to expire
Thread.sleep( 14_000L );
}
catch ( InterruptedException e )
{
}
return "dummy";
}
}
0
répondu
user1332994
2016-06-29 06:21:07
utilisez cette ligne de code:
Thread.sleep(1000);
il va dormir 1 seconde.
-28
répondu
Martin
2014-02-22 20:42:40