Java:参数化的Runnable

标准Runnable接口只有非参数化的run()方法。 还有Callable接口, call()方法返回generics类型的结果。 我需要传递generics参数,如下所示:

 interface MyRunnable { public abstract void run(E reference); } 

是否有任何标准接口用于此目的,或者我必须自己声明基本接口?

通常,您可以将RunnableCallable实现为支持genertic输入参数的类; 例如

 public class MyRunnable implements Runnable { private final T t; public MyRunnable(T t) { this.t = t; } public void run() { // Reference t. } } 

还有来自Google Collections Guava的 com.google.common.base.Function

如果将输出类型设置为? 或者Void (并且总是让它返回null )你可以使用它作为带有输入参数的Runnable的替代。

这样做的好处是能够使用Functions.compose转换输入值, Iterables.transform将其应用于集合的每个元素等。

Java 8包含java.util.function.Consumer接口,其中包含单个非默认方法void accept(T t)

该包中还有许多其他相关接口。

通常,如果您想将参数传递给run()方法,您将使用带参数的构造函数为Runnable创建子类。

例如,你想这样做:

 // code Runnable r = new YourRunnable(); r.run(someParam); //more code 

你需要这样做:

 // code Runnable r = new YourRunnable(someParam); r.run(); //more code 

您将实现类似于以下的YourRunnable

 public class YourRunnable implements Runnable { Some param; public YourRunnable(Some param){ this.param = param; } public void run(){ // do something with param } } 

我建议在原始问题中定义一个接口。 此外,通过使接口特定于它应该做的事情来避免弱类型,而不是像Runnable这样的Runnable接口。

Runnable并不是由客户端代码直接调用,如foo.run() ,它将在当前线程中顺序运行。

从Runnable API :

Runnable接口应由任何其实例由线程执行的类实现。 该类必须定义一个没有参数的方法,称为run。

此接口旨在为希望在活动时执行代码的对象提供通用协议。 例如,Runnable由Thread类实现。 活动只是意味着一个线程已经启动但尚未停止。

另外,Runnable提供了一个类活动而不是inheritanceThread的方法。 实现Runnable的类可以在没有子类化Thread的情况下运行,方法是实例化一个Thread实例并将其自身作为目标传递。 在大多数情况下,如果您只计划覆盖run()方法而不使用其他Thread方法,则应使用Runnable接口。 这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应对类进行子类化。

而是根据runnable创建一个新的Thread实例,然后调用bar.start() 。 然后JVM负责在这个单独的线程中调用run()

例:

  public class Foo implements Runnable { private final E e; public Foo(E e) { ... } @Override public void run() { do something with e. } } Foo foo = new Foo("hello"); Thread bar = new Thread(foo); bar.start();