-1

我怎样才能像在 start() 中那样获得 stop() 线程名称?线程名称为 A、B、C、D。我的程序按顺序运行线程并以相反的顺序停止它们。但是我在打印他们的名字时遇到了问题。在 start() 中我没有任何问题,但在 stop() 中我只是不知道该怎么做。我在 java 中很新,这是我做的第一个程序之一,这就是为什么我不知道该怎么做。非常感谢你的帮助。这是代码:

    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

Thread 有 name 和 getter getName(),所以如果你有 thread 实例,你可以随时调用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 回答