我有一个线程,其中有一个无限循环,执行一些网络操作。看来我每次执行此操作时都没有得到响应,因此线程挂起几秒钟,这会给我的软件带来严重问题。我需要的是循环的某种“截止日期”,如果需要更多时间(例如 100 毫秒)再次重新启动。
private boolean active = true;
public void run(){
while(active){
//some network stuff e.g:
dnshandler.reverselookup("8.8.8.8");
}
}
(这不是真正的类(class)...这只是为了了解我的意思。)
有什么想法如何处理这个问题吗?
更新: 我按照建议用单独的线程处理它。实际上我使用了 Callable 因为我需要一个返回值。
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
try {
List<Future<String>> results = executor.invokeAll(Arrays.asList(new CallableClass()), 500), TimeUnit.MILLISECONDS);
for (Future<String> current : results) {
if (!current.isCancelled()) {
someValue = current.get();
} else {
// timeout
executor.shutdownNow();
}
}
} catch (Exception e) {
//handle it!
e.printStackTrace();
}
但我现在面临的问题是,executor.shutdownNow()
没有终止挂起的 Callable 任务(根据文档,这是正确的行为)。有没有办法杀死执行者任务? (我知道这不是一个干净的解决方案,但某些请求是由库处理的)
最佳答案
例如,您可以将网络内容放入单独的线程中并运行几秒钟:
int timeoutTime = ...
Runnable networkingStuff = ... // put the networking in here
Thread thread =new Thread(networkingStuff);
thread.start();
try {
thread.join(timeoutTime);
if(thread.isAlive()) {
thread.interrupt();
}
} catch (InterruptedException e) {
// catch here the interruption
}
关于java - 固定时间后中止循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5870271/