Java:参数化的Runnable
标准Runnable
接口只有非参数化的run()
方法。 还有Callable
接口, call()
方法返回generics类型的结果。 我需要传递generics参数,如下所示:
interface MyRunnable { public abstract void run(E reference); }
是否有任何标准接口用于此目的,或者我必须自己声明基本接口?
通常,您可以将Runnable
或Callable
实现为支持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();