如题,求详解,能不能再调用呢?

解决方案 »

  1.   

    不能再调用,会抛异常public class TT {
    public static void main(String[] args) {
    A a1 = new A();
    a1.start();
    a1.start();
    }
    }class A extends Thread {
    public void run() {
    while (true) {
    System.out.println(this.getId());
    try {
    Thread.sleep(10);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }
    仅有1个线程在跑Exception in thread "main" java.lang.IllegalThreadStateException
    at java.lang.Thread.start(Unknown Source)
    at TT.main(TT.java:40)
    8
    8
    8
    8
    8
    8
    8
    8
    8
      

  2.   

    另外,如果你说的是手动调用run方法,那么完全可以start...
      

  3.   

    public void start()使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 
    结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。 多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。 
    抛出: 
    IllegalThreadStateException - 如果线程已经启动。
    另请参见:
    run(), stop()
    ----------------API将规则写的清清楚楚,非要违反规则那就只能承担后果了
      

  4.   

    总的来说 start 之后就不能再 start,这是定律。但可以换个方法,你只需要设置一个标记位,让它做完了第一件事就阻塞等待,有新的任务就放开它再接着执行。
    比如:
     public class Worker implements Runnable {
       private LinkedBlockingQueue queue;
       public Worker (LinkedBlockingQueue queue) {this.queue = queue;}
       public void run() {
      while(keepRunning) {
            Task task = (Task) queue.take(); // 如果阻塞队列中没有东西就会等待直到有东西拿到手。
            task.doIt(); 
     
      }
     }
    }... 另一个类,它负责分发任务。public void addTask(Task task) {
       queue.offer(task);
    }
      

  5.   

    不能
    Thead对象拥有一个state状态,参看javadocpublic static enum Thread.State extends Enum<Thread.State>
    线程状态。线程可以处于下列状态之一: NEW
    至今尚未启动的线程处于这种状态。 
    RUNNABLE
    正在 Java 虚拟机中执行的线程处于这种状态。 
    BLOCKED
    受阻塞并等待某个监视器锁的线程处于这种状态。 
    WAITING
    无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。 
    TIMED_WAITING
    等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。 
    TERMINATED
    已退出的线程处于这种状态。 
    在给定时间点上,一个线程只能处于一种状态。这些状态是虚拟机状态,它们并没有反映所有操作系统线程状态。当一个线程没有start的时候,处于Thread.State.NEW状态,一旦start了就会根据情况进入另一个状态,当run执行结束,就会处于Thread.State.TERMINATED状态
    LZ可以自己试着调用Thread对象的getState()方法来查看当前线程所属的状态