Java:参数化的Runnable

时间:2009-11-02 08:12:07

标签: java generics callable

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

interface MyRunnable<E> {
  public abstract void run(E reference);
}
是否有任何标准接口用于此目的,或者我必须自己声明基本接口?

6 个答案:

答案 0 :(得分:13)

通常,您会将RunnableCallable实现为支持通用输入参数的类; 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();