使用Runable接口和Thread类实现线程的异同

使用Runable接口和Thread类实现线程的异同

相同之处

  • 在实现Runable接口的类和继承Thread的类中均需要重写run()方法
  • 在启动线程时均通过调用start()方法来执行run()方法中的语句

不同之处

  • Runable是接口、Thread是类,使用时语法不同

    // 实现Runable接口
    public class MyThreadByRunable implements Runable {
        @Override
        public void run() {
            ...
        }
    }
    
    // 继承Thread类
    public class MyThreadByThread extends Thread {
        private String name;
        
        public MyThread(String name) {
            this.name = name;
        }
        
        @Override
        public void run() {
            ...
        }
    }
    
    // --------------------------------------------------------------
    public class Main {
        public static void main(String[] args) {
            Runable myThread1 = new MyThreadByRunable();
            new Thread(myThread1, "my_thread_impl_Runable").start();
            
            MyThreadByThread myThread2 = new MyThreadByThread("my_thread_extends_Thread");
            myThread2.start();        
        }
    }
    
  • 由于java单继承的特性,使用Runable接口使自定义的线程类具有更好的拓展性,而继承Thread类的自定义线程类无法实现其他的继承

  • 使用Runable接口易于实现资源共享,而继承Thread类不易于实现资源共享

    示例1:使用Runable接口

    public class MyThreadByRunable implements Runnable {
        private int count = 7;
    
        @Override
        public void run() {
            for (int i = 0; i < 3; i++) {
                System.out.println(Thread.currentThread().getName() + "is running, count = " + count--);
                try {
                    Thread.sleep((int) (Math.random() * 10));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    public class Main {
    
        public static void main(String[] args) {
            Runnable myThread1 = new MyThreadByRunable();
            new Thread(myThread1, "Thread_1").start();
            new Thread(myThread1, "Thread_2").start();
            new Thread(myThread1, "Thread_3").start();
        }
    }
    

    !
    image

    可以看到三个线程共享了count值,因为它们是从同一个实例myThread1开启的

示例2:使用Thread类

public class MyThreadByThread extends Thread {
    private String name;

    public int count = 7;

    public MyThreadByThread(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(this.name + " is running, count = " + count--);
            try {
                Thread.sleep((int) (Math.random() * 10));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class Main {

    public static void main(String[] args) {
        MyThreadByThread myThread4 = new MyThreadByThread("Thread_4");
        // 如果用同一个线程对象开启多个线程会报异常
        myThread4.start();
        myThread4.start();
    }
}
image
// 使用Thread类来开启多个线程的正确写法
public class Main {

    public static void main(String[] args) {
        MyThreadByThread myThread4 = new MyThreadByThread("Thread_4");
        MyThreadByThread myThread5 = new MyThreadByThread("Thread_5");
        MyThreadByThread myThread6 = new MyThreadByThread("Thread_6");
        myThread4.start();
        myThread5.start();
        myThread6.start();

    }
}
image

可以看到三个线程并没有共享资源,因为它们必须由不同线程对象开启。


参考

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...
    胜浩_ae28阅读 10,576评论 0 23
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 8,133评论 1 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 7,243评论 1 15
  • 一个小村子里住着许多户人家,大多是苗族,只有小姑娘亚灵一家是汉族。亚灵的邻居是个苗族老奶奶,她的儿女们都去外地打...
    开心_e阅读 3,287评论 0 1
  • 90天的秋天过了一半。 在已平衡的天平两边 一边是黑夜,一边是白天。 秋日终是深了许多,天气渐渐薄凉,暂短呈现的秋...
    蓝桉lu阅读 1,810评论 0 0

友情链接更多精彩内容