2

メイン スレッドでグローバル変数を宣言する場合、メイン スレッドから新しいスレッドを実行するとします。新しいスレッドはメイン スレッドのグローバル変数にアクセスできますか?

「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);
  }
}
4

1 に答える 1

5

複数のスレッドから見える変数は、一般的に注意が必要です。ただし、文字列は不変であるため、状況が単純になります。

表示されますが、変更された通常の値が他のスレッドで使用できる場合は保証されません。volatileスレッドをローカルにキャッシュしないようにする必要があります。を割り当てる前に、ローカル変数を使用して新しい文字列を作成しますmsg

stopFlag他のスレッドから変更する場合は、 volatile.

于 2013-07-25T18:02:11.440 に答える