2013-07-25 4 views
2

Если я объявляю глобальную переменную в основном потоке, предположим, что из основного потока я запускаю новый поток, может ли новый поток получить доступ к глобальной переменной в основном потоке?java: являются глобальными переменными, видимыми в потоках

«сбщи» строка мой переменная Acces

/* 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); 
    } 
} 
+2

Что вы подразумеваете под глобальной переменной? 'public static'? Тогда да, так осторожно при его изменении. –

+0

Да. Вот почему вам приходится беспокоиться о безопасности потоков. –

+0

Небольшой фрагмент кода поможет понять, что вы просите. – kiheru

ответ

5

переменных, которые видны несколько потоков, как правило, сложнее. Строки, однако, неизменяемы, что упрощает ситуацию.

Это видно, но если измененное обычное значение доступно для других потоков, не гарантируется. Вы должны сделать это volatile, так что он не будет кэшировать поток локально. Используйте локальную переменную для создания новой строки перед назначением msg.

Если вы намерены изменить stopFlag из других потоков, также должно быть volatile.

Смежные вопросы