【问题标题】:Queue of methods in JavaJava中的方法队列
【发布时间】:2016-08-24 20:30:43
【问题描述】:

我的目标是在扩展 Thread 的类中包含一个方法调用队列,该类的 run 方法每 15 秒从队列中弹出一个方法调用。这可以在庞大的 switch 案例中使用字符串、整数或字符以一种隐蔽的方式完成,但我想知道是否有其他人对此问题有更优雅的解决方案。

看起来像这样的东西?

public class Potato extends Thread{
    Queue<Methods> methodsQueue = new LinkedList<Methods>();

    public Potato(){}
    run(){
        methodsQueue.poll();//This would execute a method
    }

    //Methods of this class...
}

【问题讨论】:

  • 我想你会想看看Reflection API
  • 看看执行器API
  • 你到底在坚持什么?
  • 简单的解决方案,一个每 15 秒执行一次的 java.util.Timer,它从某个单一函数接口类型的队列中抓取,您可以通过编写 lambda 轻松地用通用操作填充这些函数。
  • 这一行(在 Android API 中可用)为您提供了与您尝试实现的功能相同的功能:ScheduledExecutorService s = Executors.newScheduledThreadpool(numThreads); 如果您需要使用反射运行任意方法,则将它们提交到此服务就像将每一个包装在自定义 Runnable 参数中并调用 s.schedule(Runnable,long,TimeUnit) 一样简单。我想不出更优雅、更简单的解决方案来解决您的问题(至少在使用 Java 时)。自 2004 年以来,它已被测试并用作核心 Java API 的一部分。

标签: java multithreading queue


【解决方案1】:

你可以使用一个接口来包装你想要调用的方法:

public interface MethodWrapper {
  void execute();
}

public class Potato extends Thread{
  Queue<MethodWrapper> methodsQueue = new LinkedList<>();
  public Potato(){}
  run(){
   methodsQueue.poll().execute();
  }

//Methods of this class...
}

【讨论】:

  • Runnable 会起作用,这是真的。重要的是处理某种类类型的队列而不是方法
  • 提示:你可能想提一下,这可以称为 Command 模式。围绕这种方法可以做很多有趣的事情。上帝要小心,不要使用反射。
【解决方案2】:

这一行(在 Android API 中可用)为您提供了与您尝试实现的功能相同的功能:

ScheduledExecutorService s = Executors.newScheduledThreadpool(numThreads);

如果您需要使用反射运行任意方法,那么将它们提交到该服务就像将每个方法包装在自定义 Runnable 参数中并调用 s.schedule(Runnable,long,TimeUnit);

我想不出更优雅、更简单的解决方案来解决您的问题(至少在使用 Java 时)。它的好处是自 2004 年以来已作为核心 Java API 的一部分进行了测试和使用。 – @CodeBlind

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2012-12-31
    • 2011-12-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多