如果我在主线程中声明一个全局变量,假设从主线程运行一个新线程,新线程可以访问主线程中的全局变量吗?
“msg”string是我要访问的变量
/* 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);
}
}
答案 0 :(得分:5)
多个线程可见的变量通常很棘手。但是,字符串是不可变的,因此简化了这种情况。
它是可见的,但是当不能保证修改的普通值可用于其他线程时。你应该使它volatile
,以便它不是本地缓存的线程。在分配msg
之前,使用局部变量构建新字符串。
如果您打算从其他线程修改stopFlag
,它也应该是volatile
。