标准Runnable
接口只有非参数化run()
方法。还有Callable<V>
接口,call()
方法返回泛型类型的结果。我需要传递泛型参数,如下所示:
interface MyRunnable<E> {
public abstract void run(E reference);
}
是否有任何标准接口用于此目的,或者我必须自己声明基本接口?
答案 0 :(得分:13)
通常,您会将Runnable
或Callable
实现为支持通用输入参数的类; e.g。
public class MyRunnable<T> implements Runnable {
private final T t;
public MyRunnable(T t) {
this.t = t;
}
public void run() {
// Reference t.
}
}
答案 1 :(得分:9)
Google Collections com.google.common.base.Function<F, T>还有Guava
。
如果您将输出类型设置为?
或Void
(并始终让它返回null
),您可以将其用作Runnable
的替代输入参数
这样做的好处是可以使用Functions.compose
转换输入值,Iterables.transform
将其应用于集合的每个元素等。
答案 2 :(得分:8)
Java 8包含java.util.function.Consumer<T>
接口,其中包含单个非默认方法void accept(T t)
。
还有许多其他相关接口in that package。
答案 3 :(得分:3)
通常,如果您想将参数传递给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
}
}
答案 4 :(得分:0)
我建议在原始问题中定义一个接口。此外,通过使界面特定于它应该做的事情来避免弱类型,而不是像Runnable
这样的无意义界面。
答案 5 :(得分:-3)
Runnable不应由foo.run()
等客户端代码直接调用,这些代码将在当前线程中按顺序运行。
来自Runnable API:
Runnable接口应该是 由任何类的人实施 实例旨在执行 通过一个线程。该类必须定义一个 没有参数的方法叫做run。
此界面旨在提供 对象的通用协议 希望在它们执行时执行代码 活性。例如,Runnable是 由Thread类实现。存在 active只是意味着一个线程有 已经开始并且还没有 停止。
另外,Runnable提供了 意味着一个类是活跃的 不是子类化Thread。一类 实现Runnable可以不运行 通过实例化a来继承Thread 线程实例并传入自身 作为目标。在大多数情况下, 如果是,则应使用Runnable接口 你只打算重写 run()方法,没有其他Thread 方法。这很重要,因为 类不应该是子类 除非程序员打算 修改或增强基础 班级的行为。
相反,您可以基于runnable创建一个新的Thread实例,然后调用bar.start()
。然后,JVM有责任在这个单独的线程中调用run()
。
示例:
public class Foo<E> implements Runnable {
private final E e;
public Foo(E e) { ... }
@Override
public void run() {
do something with e.
}
}
Foo<String> foo = new Foo("hello");
Thread bar = new Thread(foo);
bar.start();