Standard Runnable
interface has only non-parametrized run()
method. There is also Callable<V>
interface with call()
method returning result of generic type. I need to pass generic parameter, something like this:
interface MyRunnable<E> {
public abstract void run(E reference);
}
Is there any standard interface for this purpose or I must declare that basic one by myself?
Typically you would implement Runnable
or Callable
as a class that supported a genertic input parameter; e.g.
public class MyRunnable<T> implements Runnable {
private final T t;
public MyRunnable(T t) {
this.t = t;
}
public void run() {
// Reference t.
}
}
There is also com.google.common.base.Function<F, T>
from Google CollectionsGuava.
If you set the output type to ?
or Void
(and always have it return null
) you can use it as an alternative to Runnable
with an input parameter.
This has the advantage of being able to use Functions.compose
to transform the input value, Iterables.transform
to apply it to every element of a collection etc.
Java 8 includes the java.util.function.Consumer<T>
interface with the single non-default method void accept(T t)
.
There are many other related interfaces in that package.
Generally if you wanna pass a parameter into the run()
method you will subclass Runnable
with a constructor that takes a parameter.
For example, You wanna do this:
// code
Runnable r = new YourRunnable();
r.run(someParam);
//more code
You need to do this:
// code
Runnable r = new YourRunnable(someParam);
r.run();
//more code
You will implement YourRunnable
similar to below:
public class YourRunnable implements Runnable {
Some param;
public YourRunnable(Some param){
this.param = param;
}
public void run(){
// do something with param
}
}
I suggest defining an interface as done in the original question. Further, avoid weak typing by making the interface specific to what it is supposed to do, rather than a meaning-free interface like Runnable
.
Runnable isn't meant to be called directly by client code like foo.run()
which would run sequentially in the current thread.
From the Runnable API:
The Runnable interface should be
implemented by any class whose
instances are intended to be executed
by a thread. The class must define a
method of no arguments called run.
This interface is designed to provide
a common protocol for objects that
wish to execute code while they are
active. For example, Runnable is
implemented by class Thread. Being
active simply means that a thread has
been started and has not yet been
stopped.
In addition, Runnable provides the
means for a class to be active while
not subclassing Thread. A class that
implements Runnable can run without
subclassing Thread by instantiating a
Thread instance and passing itself in
as the target. In most cases, the
Runnable interface should be used if
you are only planning to override the
run() method and no other Thread
methods. This is important because
classes should not be subclassed
unless the programmer intends on
modifying or enhancing the fundamental
behavior of the class.
Instead, you create a new Thread instance based on your runnable, and then call bar.start()
. It is then the JVM's responsibility to call run()
in this separate thread.
Example:
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();