Java:从线程操作非静态变量?

标签 java string multithreading variables static

我的代码的相关摘要是这样的:

public class A {
    String aString;

    public static void main(String[] args) {
        B b = new B();
        new Thread(b).start();
    }
    public static class B implements Runnable {
        public void run() {
            aString = "foo";
        }
    }
}

我已经有几个月的 Java 编码经验,但线程动态静态对我来说仍然相当陌生。为了使线程正确执行,类 B 必须是静态的,否则只有线程执行,而不是两者都执行。我的目标显然是让线程在后台执行,以便我在 A 类中可能拥有的其他代码可以同时执行。问题是,如果类 B 是静态的,我无法操作字符串 aString,因为我收到异常 非静态变量 aString 无法从静态上下文引用

我已经查找了有关此问题的信息,但没有找到任何与在线程中解决此问题相关的内容。我的问题是,如何在 B 类中操作 aString 并且仍然使线程正常工作(两个类都在运行,而不仅仅是 B 类)?

最佳答案

为了使您的示例正常工作,您需要如下内容:

public class A {
    volatile String aString;

    public static void main(String[] args) throws InterruptedException {
        A a = new A();
        Thread t = new Thread(a.new B());
        t.start();
        t.join(); // wait for t to finish
        System.out.println(a.aString); // prints "foo"
    }

    class B implements Runnable {
        public void run() {
            aString = "foo";
        }
    }
}

解决静态问题是比较简单的部分 - 请参阅代码了解具体方法。

我希望代码的其余部分有助于说明使用线程时需要解决的一些问题。

关于Java:从线程操作非静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28493053/

相关文章:

python - 如何用 Python 编写原始二进制数据?

java - 从 Java 运行 AWK 创建文件并使用 BufferedReader 读取它

java - 推荐用于 Joda-Time 的 DateMidnight

java - 如何避免 @SuppressWarnings({ "unchecked", "rawtypes"}) 无处不在?

c - 如何使用简单的语句描述有关C语言中函数 'sprintf'的重复格式说明符?

C++将指针常量作为参数从main传递给方法

linux - 多线程、阻塞和内存映射文件

multithreading - QThread中的QTcpSocket

multithreading - MonoTouch 6.x 中的线程模型更改?

java - Android 许可证验证响应包含什么用户 ID?