-1

start() で行ったように、stop() スレッド名を取得するにはどうすればよいですか? スレッド名は A、B、C、D です。私のプログラムはスレッドを順番に実行し、逆順に停止します。しかし、私は彼らの名前を印刷することに問題があります。start() では問題なく実行できますが、stop() では方法がわかりません。私はJavaでかなり新しく、これは私がやった最初のプログラムの1つであり、これを行う方法がわかりません。手伝ってくれてどうもありがとう。コードは次のとおりです。

    import java.util.*;

class Service extends Thread
{
  private RobotController controller;
  public String robotID;
  private byte[] lock;                                          

  public Service(RobotController cntrl, String id)
  {
    controller = cntrl;
    robotID = id;
  }

  public byte[] getLock() { return lock;}                                                              
  public void run()
  {
    lock = new byte[0]; 
    synchronized(lock)                                          
    {
      byte[] data;
      while ((data = controller.getData()) == null)
      {
        try {
          lock.wait();  
        } catch (InterruptedException ie) {}
      }
      System.out.println("Thread " + robotID + " Working" );
    }
  }

}

class RobotController
{
      private byte[] robotData;
      private Vector threadList = new Vector();                      
      private Service thread_A;
      private Service thread_B;
      private Service thread_C;
      private Service thread_D;

    public void setup(){
        thread_A = new Service(this, "A");
        thread_B = new Service(this, "B");
        thread_C = new Service(this, "C");
        thread_D = new Service(this, "D");
        threadList.addElement(thread_A);                               
        threadList.addElement(thread_B);                                
        threadList.addElement(thread_C);                                
        threadList.addElement(thread_D);                                
        thread_A.start();
        thread_B.start();
        thread_C.start();
        thread_D.start();
        start();
        stop();
      }

      public void start()
      { 
          System.out.println("START:");
          {
                for (int i=0; i <threadList.size(); i++)                                    
                {
                  try {
                    Thread.sleep(500);
                  }catch (InterruptedException ie){
                      System.out.println(ie);
                  }
                  putData(new byte[10]);
                  Service rbot = (Service)threadList.elementAt(i);
                  byte[] robotLock = rbot.getLock();
                  synchronized(robotLock) {                                     
                    robotLock.notify();                                      
                  }
                }
          }
      }

      public void stop()
      {
          Collections.reverse(threadList);
          System.out.println("STOP:");
          for ( Object o : threadList) {
            System.out.println("Thread "+ o +" Stop");
          }
      }

      public synchronized byte[] getData()                          
      {
        if (robotData != null)
        {
          byte[] d = new byte[robotData.length];
          System.arraycopy(robotData, 0, d, 0, robotData.length);
          robotData = null;
          return d;
        }
        return null;
      }

      public void putData(byte[] d) { robotData = d;}

      public static void main(String args[])
      {
        RobotController controller = new RobotController();
        controller.setup();
      }
}
4

1 に答える 1

0

スレッドには名前とゲッターgetName()があるため、スレッドのインスタンスがあればいつでも呼び出すことができますthread.getName()

を呼び出す場所がわからないため、「開始時に」スレッド名にアクセスする方法がわかりませんgetName()。しかし、私はあなたの問題が何であるかを知っていると思います。

スレッドを に保存しますVector。次に、ベクトルの要素と印刷スレッドを反復処理して、スレッドのtoString(). あなたはおそらくそれにキャストObjectThreadて呼び出す必要がありますgetName()

      System.out.println("STOP:");
      for ( Object o : threadList) {
        System.out.println("Thread "+ ((Thread)o).getName() +" Stop");
      }

しかし、完了したら、Java に関する十分に優れた新しいチュートリアルを見つけることをお勧めします。

  1. 一般的に適用されないコーディング形式を使用しています。
  2. とその実装Vectorの代わりに使用しています。List
  3. スレッドの同期と管理に不明確な手法を使用しようとしています。

ステップバイステップで学習を開始します。そして、遠慮なく質問してください。幸運を。

于 2013-06-05T17:32:29.477 に答える