Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从正在运行的线程将赋值设置为字符串?_Java_Multithreading_Assign - Fatal编程技术网

Java:从正在运行的线程将赋值设置为字符串?

Java:从正在运行的线程将赋值设置为字符串?,java,multithreading,assign,Java,Multithreading,Assign,如何在java中为run()之外的字符串赋值。它启动新线程,运行并获取值,然后应该返回它。若我试着在线程中设置string=value,它会告诉我需要将string更改为final,这样就行不通了 对此有什么建议吗?正如罗恩·达尔格伦所评论的那样,正确的方法是使用。这样做的技巧是将字符串分配给final string[]oneStringReference=new string[1]的第一个元素 public class MyCallable implements Callable {

如何在java中为run()之外的字符串赋值。它启动新线程,运行并获取值,然后应该返回它。若我试着在线程中设置string=value,它会告诉我需要将string更改为final,这样就行不通了


对此有什么建议吗?

正如罗恩·达尔格伦所评论的那样,正确的方法是使用。这样做的技巧是将字符串分配给
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() {
        ...
    }
}
“它告诉我需要将字符串更改为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);
    }
}
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());
    }
}
你们会发现编译器在抱怨“myString应该是final”之类的东西。它与多线程无关。简单地说,对于匿名内部类,它只能访问封闭范围中的最终变量

假设字符串是不可变的,通过保持原始代码结构来解决问题的方法之一是,让字符串的某个持有者是最终的。字符串数组是一种可能的选择,或者您可以将保持器设置为如下所示:

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";

        Thread t = new Thread(
            new Runnable() {
                @Override
                public void run() {
                    myString = "xyz";
                }
            }
        };
        t.start();
        t.join();
        System.out.println("result :" + myString);
    }
}
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());
    }
}
但是,这不是从线程获取结果的推荐方法


我强烈建议您更改代码结构,并研究将来(和相关类)的使用情况。

虽然我不完全确定这是您需要的,但如果您想从单独的线程返回值,请查看可调用接口并使用Executor,我不会“hack”这与数组引用有关——没有外部
同步
声明,这不是传递数据的线程安全方式,可能会导致意外行为!我让它工作起来了,谢谢,我只是想把参数放到Call()中,创建一个实现Callable的新类,并将参数传递给它的构造函数