如何向线程传递参数

4
假设我想传递以下变量
String foo = "hello world";

作为以下线程的参数
new Thread(new Runnable() {

    @Override
    public void run() {
        // SOME CODE HERE REQUIRES VARIABLE
    }
}).start();

请问有人可以解释如何完成这个操作吗?

谢谢。


请参见此处:https://dev59.com/H3NA5IYBdhLWcg3wpvtg - The Good Giant
@TheGoodGiant 在链接的问题线程中是被子类化的,而这里却不是。此外,在这里有一个更简单的解决方案可用... - vidstige
5个回答

4

子类化 Thread 类:

public class MyThread extends Thread {

   private String arg;

   public MyThread(String arg) {
      this.arg = arg;
   }

   @Override
   public void run() {
        // Use your variable
   }
}

3

有人能否解释一下如何做到这一点。

你的问题有很多解决方案,但从一开始就要很好地完成。我建议你创建自己的Thread子类,并通过它的构造函数传递参数。

public class MyThread extends Thread {

    public MyThread(String value) {

    }
}

或者您也可以使用Runnable接口。

public class MyThread implements Runnable { ... }

更新:

或者像 @erickson 指出的那样,您可以将代码包装到方法体中,但作为方法的参数,您必须传递 final 变量,因为您不能在不同方法中定义的内部类中引用非 final 变量。


2
-1 不需要贬低提问者。这是一个合理的问题。 - Peter Bratton
@jordan002 贬低?你开玩笑吧?我写了三种可能的方法他可以使用。我提到子类,因为如果他想改变这个变量,由于它被声明为 final,这是不可能的。只能定义下一个辅助变量。抱歉,但我不同意你的观点。 - Simon Dorociak
如果他确实想要从另一个线程更改变量的值,那么会有许多陷阱。 - erickson
1
@jordan002 不不不,兄弟,我对你的反馈感到非常惊讶,这是我第一次听到这种反应,现在我知道你讨厌什么,那就是我所用的用词,非常抱歉,我会加以修正。 - Simon Dorociak
1
@Sajmon 看起来不错。就我而言,你的答案很到位。 - Peter Bratton
显示剩余3条评论

3

声明为final的局部变量将在线程中可见:

void doSomething(final String foo) {
  new Thread(new Runnable() {
      @Override
      public void run() {
        // SOME CODE HERE REQUIRES VARIABLE
        System.out.println(foo);
      }
  }).start();
}

0
在Java中,无法使用匿名类传递参数。您可以做的是创建一个单独的类并将其作为实例变量传递。

0
String foo = "hello world";
final String parameter = foo;
new Thread(new Runnable() {

    @Override
    public void run() {
         //Use parameter
    }
}).start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接