java - 使用回调函数在线程中注册事件

标签 java multithreading events concurrency callback

我正在修改我的服务器,以便每次接受连接时,它都应该使用回调函数在线程中注册超时事件。超时可以是任意数字。

只有一个超时线程(每个连接没有分配给一个单独的超时线程)。

我该如何去做呢?我正在考虑在 main 中启动一个线程,但不确定如何用它注册超时事件以及如何传递参数。

最佳答案

使用 ScheduledExecutorService :

ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
void registerCallback() {
  ses.schedule(new MyCommand(), 30, TimeUnit.SECONDS);
}

它返回 Future如果您愿意,可以使用它来取消执行,或者获取 MyCommand 返回的值。

如果您想要安排一个及时重复的命令,您可以使用其他安排方法:scheduleAtFixedRatescheduleWithFixedDelay

如果您只需要在某些条件下重新安排,或者以不同的速率或间隔进行重新安排,我使用的一种技术是将 ScheduledExecutorService 传递给您的命令(即 new MyCommand( ses)) 并让它重新安排自己或具有适当延迟的新命令:

class MyCommand implements Runnable {
  private final ScheduledExecutorService ses;
  MyCommand(ScheduledExecutorService ses) { this.ses = ses; }
  private boolean shouldReschedule() { ... }
  private int getRescheduleTimeoutMs() { ... }
  @Override void run() {
    // do work
    ...
    // reschedule if needed
    if (shouldReschedule()) {
      // reschedule this command:
      ses.schedule(this, getRescheduleTimeoutMs(), TimeUnit.MILLISECONDS);
      // or else a new one:
      ses.schedule(new MyCommand(ses), ...);
    }
  }
}

关于java - 使用回调函数在线程中注册事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9371900/

相关文章:

multithreading - 如何在单独的线程(与主线程不同)中打开ClientDataSet(主/详细)

c# - CPU 使用率过高

java - Collections.synchronizedList/synchronizedMap 的真正值(value)是什么?

cocoa - 如何在cocoa osx中检测网络事件

windows - 如何在不触摸系统级别的任何输入设备的情况下触发按键或鼠标单击事件?

java - IOException,HTTP 响应代码为 : 400 occurs intermittently and works after server restart

Java如何使用多个参数函数将List转换为Map

c# - 如何使用预构建类设置事件处理

java.lang.OutOfMemory错误: Java heap space - while writing pdf to outputstream

java - 无法访问其他类中的 public static Vector<Vector> 对/数据?