zoukankan      html  css  js  c++  java
  • JAVA多线程:什么时候使用哪种实现方式

    众所周知,JAVA里实现多线程有两种方式。

    一是继承Thread,覆盖run()方法:

    public class ThreadTest {
        public static void main(String[] args) {
            new MyThread().start();
        }
    }
    
    class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("Thread.run()");
            super.run();
        }
    }

    二是实现Runnable接口,实现run()方法:

    public class ThreadTest {
        public static void main(String[] args) {
            new Thread(new MyRunnable()).start();
        }
    }
    
    class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println("Runnable.run()");
        }
    }

    这两种都是常用方法,那么问题来了,我们什么时候用哪种方式?sun公司当初为什么会设计两种实现方式?

    很明显,我们在使用继承Thread方式时,有一个很大的缺点,就是我们继承了Thread后就不能继承其他类了。但是如果我们实现Runnable的话,恰好可以解决这个问题。

    实际上,我们的Thread类里面有这么一段代码:

        /* What will be run. */
        private Runnable target;
    
        public void run() {
          if (target != null) {
              target.run();
          }
        }

    这是Thread类里面的run()方法,如果target(即Runnable对象)非空的话,它会直接调用Runnable的run()方法。

    而Thread()类的run()方法是实现Runnable接口的:

    publicclass Thread implements Runnable {

    所以无论是哪种实现方式的run()其实都是一样的,但是Runnable方式有很明显的优势,就是它可以继承别的类而非局限于Thread类,Runnable方式说白了就是弥补这个缺陷而设计出来的。所以具体使用哪种方法就根据你实际情况了。

    最后介绍个学习网站:Here

  • 相关阅读:
    失落的情
    我有个想法------彩南书屋
    西藏旅游闲记(上)
    夜归
    宝石山再记
    学车的日子(一)
    BootStrapValidator表单验证插件的学习和使用
    shard_row_id_bits & pre_split_regions
    某某大肠_tikv_修改配置参数
    第十二周总结
  • 原文地址:https://www.cnblogs.com/cha1r/p/3432417.html
Copyright © 2011-2022 走看看