gpt4 book ai didi

java: 全局变量在线程中是否可见

转载 作者:行者123 更新时间:2023-11-30 06:23:48 25 4
gpt4 key购买 nike

如果我在主线程中声明了一个全局变量,假设我从主线程运行一个新线程,新线程是否可以访问主线程中的全局变量?

“msg”字符串是我要访问的变量

/* A simple banner applet.

This applet creates a thread that scrolls
the message contained in msg right to left
across the applet's window.
*/
import java.awt.*;
import java.applet.*;
/*
<applet code="SimpleBanner" width=300 height=50>
</applet>
*/

public class AppletSkel extends Applet implements Runnable {
String msg = " A Simple Moving Banner."; //<<-----------------VARIABLE TO ACCESS
Thread t = null;
int state;
boolean stopFlag;

// Set colors and initialize thread.
public void init() {
setBackground(Color.cyan);
setForeground(Color.red);
}

// Start thread
public void start() {
t = new Thread(this);
stopFlag = false;
t.start();
}

// Entry point for the thread that runs the banner.
public void run() {
char ch;

// Display banner
for( ; ; ) {
try {
repaint();
Thread.sleep(250);
ch = msg.charAt(0);
msg = msg.substring(1, msg.length());
msg += ch;
if(stopFlag)
break;
} catch(InterruptedException e) {}
}
}

// Pause the banner.
public void stop() {
stopFlag = true;
t = null;
}

// Display the banner.
public void paint(Graphics g) {
g.drawString(msg, 50, 30);
g.drawString(msg, 80, 40);
}
}

最佳答案

对多个线程可见的变量通常很棘手。然而,字符串是不可变的,因此可以简化情况。

它是可见的,但不能保证修改后的普通值何时对其他线程可用。您应该使它成为 volatile,这样它就不会在本地缓存线程。在分配 msg 之前使用局部变量构建新字符串。

如果您打算从其他线程修改stopFlag,它也应该是volatile

关于java: 全局变量在线程中是否可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17865256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com