关于java中的Runnable接口的问题?

时间:2010-12-27 01:09:44

标签: java multithreading

实现线程的一种方法是这样的:

  Runnable r1 = new Runnable() { 
    public void run() {
          // my code here
    }
  };  

  Thread thread1 = new Thread(r1);
  thread1.start();

现在,如果我坚持使用这个简单的方法,那么无论如何都要从该线程外部传递一个运行块内的值。例如,我在运行中的代码包含一个逻辑,该逻辑需要来自将在调用时使用的进程的输出流。

如何将此流程流对象传递给此运行块。

我知道还有其他方法,比如实现runnable或extenting thread,但是你能告诉我如何使用上面的方法完成这个。

3 个答案:

答案 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());
}