JAVA多线程Thread和Runnable

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37636695/article/details/79116709

Java中实现多线程有两种方法:继承Thread类;实现Runnable接口。

Thread类的run()方法的制定了接口Runnable中的run();
在Thread类中没有完全实现Runnable接口中的run()方法。
Thread类是Runnable接口的子类,Thread类中的run()方法调用的是Runnable接口中的run()方法。

public class Thread implements Runnable {    //Thread类的部分定义
   private Runnable target; //封装
   public Thread(Runnable target){ //构造函数
      init(target);
   }
   private void init(Runnable target2) { //检验关口,给属性赋值
      this.target = target;
   }
   public void run() {
      if(target != null){
        target.run();           //此run方法指的是自定义的run方法,即Runable中的run方法
                         //整个过程中,只有一个对象,只有这个对象有能力调用自定
                         //义的run方法。
      }
   }
}

由于使用Runable的整个过程中,只产生一个对象,所以可以方便地实现资源的共享。
这也是Runable优于Thread之处。

启动线程是调用start方法启动:

public synchronized void start() {
    // 如果线程不是"就绪状态",则抛出异常!
    if (threadStatus != 0)
        throw new IllegalThreadStateException();

    // 将线程添加到ThreadGroup中
    group.add(this);

    boolean started = false;
    try {
        // 通过start0()启动线程
        start0();
        // 设置started标记
        started = true;
    } finally {
        try {
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
        }
    }
}

从上面的源码可以看出,如果一个类继承了Thread类,那么只能调用一次start()方法,如果多次调用,
将会出现“IllegalThreadStateException”异常。

Thread与Runable的重要区别之一是:

Thread不适合于多线程共享资源。

Runable可以方便地实现资源的共享。

如果一个类只能继承Thread类才能实现多线程,则必定受到单线程的局限性。

所以一般来说我们会用Runable接口来完成多线程操作。

扫描二维码关注公众号,回复: 2895471 查看本文章


猜你喜欢

转载自blog.csdn.net/qq_37636695/article/details/79116709