java - 固定时间后中止循环

标签 java loops concurrency

我有一个线程,其中有一个无限循环,执行一些网络操作。看来我每次执行此操作时都没有得到响应,因此线程挂起几秒钟,这会给我的软件带来严重问题。我需要的是循环的某种“截止日期”,如果需要更多时间(例如 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/

相关文章:

java - 如何使用 Java 从 cookie 驱动的网站获取网页源

java - 如何在 Java VisualVM 中查看内存分配堆栈跟踪

java - 如何加速并发 Lucene 应用程序?

java - IntelliJ 库版本 IntelliJ IDEA IU-181.4203.550 中缺少 BytePointer 和 ClsUtil 类

java - 在页面加载 jsp 上运行方法

C++ 帮助 : loops and switches

c - 在 C 上使用 OpenMP 并行一段时间

c - 与负整数比较时忽略 for 循环条件

c++ - 通过订购 std::mutex 避免死锁

java - 并发 - foreach 循环中的非阻塞设计