0

如何在 java 中的 run() 之外为 String 赋值。它正在启动新线程,运行并获取值,然后应该返回它。如果我尝试在线程中设置 string = value,它会告诉我需要将 String 更改为 final,这将不起作用

对此有何建议?

4

2 回答 2

1

“它告诉我我需要将 String 更改为 final 这将无法正常工作”

似乎暗示我您的问题与线程无关,而是与封闭范围内的变量相关的(匿名)内部类访问。

我敢打赌你在做什么是这样的:

class Foo {
    public void foo() {
        String myString = "abc";

        Thread t = new Thread(
            new Runnable() {
                @Override
                public void run() {
                    myString = "xyz";
                }
            }
        };
        t.start();
        t.join();
        System.out.println("result :" + myString);
    }
}

你会发现编译器抱怨“myString 应该是最终的”之类的东西。它与多线程无关。很简单,对于匿名内部类,它只能访问封闭范围内的最终变量。

鉴于 String 是不可变的,通过保留原始代码结构来解决的一种方法是,拥有一些最终的 String 持有者。字符串数组是一种可能的选择,或者您可以像这样简单地制作一个持有者:

public class StringHolder {
    String value;
    public StringHolder(String value) {
        this.value = value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public value getValue() {
        return this.value;
    }
}

并将您的代码更改为以下内容:

class Foo {
    public void foo() {
        String myString = "abc";
        final StringHolder myStringHolder = new StringHolder(myString);

        Thread t = new Thread(
            new Runnable() {
                @Override
                public void run() {
                    myStringHolder.setValue("xyz");
                }
            }
        };
        t.start();
        t.join();
        System.out.println("result: " + myStringHolder.getValue());
    }
}

但是,这不是从线程获取结果的推荐方式。

我强烈建议您更改代码结构,并研究 Future(和相关类)的用法。

于 2013-04-23T02:19:11.230 回答
0

正如 Ron Dahlgren 评论的那样,正确的方法是使用Callable。这样做的技巧是将您的字符串分配给 a 的第一个元素final String[] oneStringReference = new String[1];

public class MyCallable implements Callable {
    private Object param1;
    private Object param2;
    private Object param3;

    public MyCallable(Object param1, Object param2, Object param3) {
        this.param1 = param1;
        this.param2 = param2;
        this.param3 = param3;
    }

    public Object Callable() {
        ...
    }
}
于 2013-04-23T01:24:18.813 回答