实现线程的一种方法是这样的:
Runnable r1 = new Runnable() {
public void run() {
// my code here
}
};
Thread thread1 = new Thread(r1);
thread1.start();
现在,如果我坚持使用这个简单的方法,那么无论如何都要从该线程外部传递一个运行块内的值。例如,我在运行中的代码包含一个逻辑,该逻辑需要来自将在调用时使用的进程的输出流。
如何将此流程流对象传递给此运行块。
我知道还有其他方法,比如实现runnable或extenting thread,但是你能告诉我如何使用上面的方法完成这个。
答案 0 :(得分:5)
您可以使用本地final
变量:
final OutputStream stream = /* code that creates/obtains an OutputStream */
Runnable r1 = new Runnable() {
public void run() {
// code that uses stream here
}
};
Thread thread1 = new Thread(r1);
thread1.start();
匿名内部类可以看到 final
个变量,例如上面的Runnable
。
如果您的Runnable变得足够复杂,那么您应该考虑将其变为命名类。此时,构造函数参数通常是传递参数的最佳机制。
答案 1 :(得分:1)
这个答案假设您在启动线程时没有OutputStream
方便,但稍后会获得它。 如果您已有流对象引用,则应使用Laurence的示例。
您可以使用一些包装类,如下所示:
// This is a very simplified example; use getters and setters instead.
class OutputStreamWrapper {
public OutputStream outputStream;
}
然后你可以这样做:
final OutputStreamWrapper wrapper = new OutputStreamWrapper();
Runnable r1 = new Runnable() {
public void run() {
// use wrapper.outputStream in here when appropriate
}
};
Thread thread1 = new Thread(r1);
thread1.start();
然后,您将wrapper
变量引用的对象传递给其他方法或类,而这些方法或类又将outputStream
属性设置为将流传递给线程代码。
请注意,这是一种黑客攻击;在另一个类上实现Runnable
并给它这样一个字段会更好。
答案 2 :(得分:0)
是的,有可能。从run
方法内部,您可以访问封闭方法中具有final
限定符的所有变量。
public void demo() {
final int accessible = 123;
int notAccessible = 456;
new Thread(new Runnable() {
public void run() {
System.out.println(accessible);
}
}.start());
}