为什么继承Thread的线程多次start 会运行错误 而implement Runnable 的多次start就不会运行出错

就写了一个Thread子类
一个实例
Thread t = new MyThread();
t.start();
t.start();
t.start();
=================================
Runnable r=new Mythread();
new Thread(r).start();
new Thread(r).start();
new Thread(r).start();
=================================
是因为每个线程对象只能start一次????
=================================
Thread类中有run()和start()两个方法
run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;
start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;
这是我找到的答案
有点迷糊,暂时没看明白
=================================

  运行错误的原因:通过Thread实例的start(),一个Thread的实例只能产生一个线程。
  1,一个Thread的实例一旦调用start()方法,这个实例的started标记就标记为true,事实中不管这个线程后来有没有执行到底,只要调用了一次start()就再也没有机会运行了。
  2,如果要在一个实例上产生多个线程(也就是我们常说的线程池),可以用Runnable接口来实现:
  class R implements Runnable{
 private int x = 0;
 public void run(){
  for(int i=0;i<100;i++){
    try{
     Thread.sleep(10);
    }catch(Exception e){}
    System.out.println(x++);
  }
 }
}
  3,正如它的名字一样,Runnable的实例是可运行的,但它自己并不能直接运行,它需要被Thread对象来包装才行运行:
  public class Test {
 public static void main(String[] args) throws Exception{
  new Thread(new R()).start();
 }
}
  4,当然这个结果和mt.start()没有什么区别。但如果我们把一个Runnable实例给Thread对象多次包装,我们就可以看到它们实际是在同一实例上启动线程:
  public class Test {
 public static void main(String[] args) throws Exception{
  R r = new R();
  for(int i=0;i<10;i++)
    new Thread(r).start();
 }
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-24
你把概念搞混了。

第一个段代码里,你怎么start都是同一个线程。
而第二段代码,你三次start,每次都new了一个新线程。
所以你两次操作是完全不一样的,一个线程就是只能start一次。本回答被提问者采纳
第2个回答  2013-08-24
Thread 终止后 销毁了
第3个回答  2018-05-14
看了一下start()方法的部分源码,一个Thread的实例一旦调用start()方法,其状态就变了!=0
public synchronized void start() { if (threadStatus != 0)//状态校验
throw new IllegalThreadStateException();}就会报IllegalThreadStateException错误。

...会运行错误 而implement Runnable 的多次start就不会运行出错_百度...
运行错误的原因:通过Thread实例的start(),一个Thread的实例只能产生一个线程。1,一个Thread的实例一旦调用start()方法,这个实例的started标记就标记为true,事实中不管这个线程后来有没有执行到底,只要调用了一次start()就再也没有机会运行了。2,如果要在一个实例上产生多个线程(也就是我们常说的线...

如何dump android线程的stack
区别就是,一个是直接创建Thread对象,另外一个是需要implement了Runnable接口对象作为创建Thread对象的参数。Runnable其实我们称为线程任务。 第一种方式一般是这样用: Class MyThread extends Thread{ public void run(){ \/\/你要实现的代码 } } 在主线程中启动这个线程: public class T...

用java实现一个可创建4个线程的程序,每个线程在休眠1秒后显示该线程已...
测试了一下,应该可以用,你可以试试,不对的地方再问我~public class BaiduThread implements Runnable { private String name; public BaiduThread(String name) { this.name = name; } @Override public void run() { long startTime = System.currentTimeMillis(); long...

在JAVA中如何实现长时间任务
我们可以通过继承Thread类或实现java.lang.Runnable接口来达到该目标。如果采用实现Runnable接口的方式,就可以能够获得更好的面向对象的设计,同时可以避免JAVA中的单继承问题。另外,我们也能更有效的处理Runnable实例(例如使用线程池通常需要一个Runnable实例而不是线程来运行)。 The essence of the framework is the abstr...

求"求素数的C语言程序"
include <stdio.h> int main(){ int a=0;int num=0;int i;printf("输入一个整数:");scanf("%d",&num);for(i=2;i<num;i++){ if(num%i==0){ a++;} } if(a==0){ printf("%d是素数。\\n", num);}else{ printf("%d不是素数。\\n", num);} return 0;} ...

相似回答