// 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
}
}
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();
6条答案
按热度按时间1sbrub3j1#
通常你会实现
Runnable
或者Callable
作为支持泛型输入参数的类;例如zte4gxcn2#
一般来说,如果要将参数传递到
run()
方法将子类化Runnable
使用一个接受参数的构造函数。例如,你想这样做:
您需要这样做:
你将实施
YourRunnable
如下所示:stszievb3#
还有
com.google.common.base.Function<F, T>
来自google collectionsguava。如果将输出类型设置为
?
或者Void
(并且总是让它回来null
)你可以用它来代替Runnable
输入参数。这样做的好处是可以使用
Functions.compose
要转换输入值,Iterables.transform
将其应用于集合的每个元素等。wlp8pajw4#
我建议像原来的问题那样定义一个接口。此外,通过使接口特定于它应该做的事情来避免弱类型,而不是像这样的无意义接口
Runnable
.edqdpe6u5#
Java8包括
java.util.function.Consumer<T>
与单个非默认方法的接口void accept(T t)
.该包中还有许多其他相关接口。
kknvjkwl6#
runnable并不意味着像这样的客户端代码可以直接调用
foo.run()
它将在当前线程中顺序运行。从runnable api:
可运行接口应该由任何类实现,这些类的示例将由线程执行。该类必须定义一个名为run的无参数方法。
此接口旨在为希望在活动时执行代码的对象提供公共协议。例如,runnable是由类thread实现的。活动仅仅意味着线程已经启动,还没有停止。
此外,runnable提供了一种方法,使类在不将线程子类化的情况下处于活动状态。通过示例化线程示例并将自身作为目标传入,实现runnable的类可以在不将线程子类化的情况下运行。在大多数情况下,如果只计划重写run()方法而不打算重写其他线程方法,则应该使用runnable接口。这一点很重要,因为类不应该被子类化,除非程序员打算修改或增强类的基本行为。
相反,您可以基于runnable创建一个新的线程示例,然后调用
bar.start()
. 然后jvm负责调用run()
在这个单独的线程中。例子: