zoukankan      html  css  js  c++  java
  • 多线程--Thread和Runnable区别

      线程的创建有两种方式,分别是继承Thread类和实现Runnable接口,那么这两种方式有什么相同点,以及区别在何处呢?

      首先通过两个实例还看一下他们的相同之处:

      实例1:使用继承Thread类

       创建子类MultiExtendThread:    

    public class MultiExtendThread extends Thread {
    
        private   int ticket = 10;//每个线程拥有10张票
        private String name;
    
        MultiThread3(String name) {
            this.name = name;
        }
    
        public void run() {
            while (ticket > 0) {
                System.out.println(ticket-- + " is saled by " + name);
            }
        }
    }

       测试类:    

     public static void main(String[] args) {
    
            MultiExtendThread m1 = new MultiExtendThread ("Window 1");
            MultiExtendThread m2 = new MultiExtendThread ("Window 2");
            MultiExtendThread m3 = new MultiExtendThread ("Window 3");
            //创建3个线程
            Thread t1 = new Thread(m1 );
            Thread t2 = new Thread(m2);
            Thread t3 = new Thread(m3);
    
            t1.start();
            t2.start();
            t3.start();
    
        }

       测试结果:以多线程的形式各自打印出售票信息,每个线程分别打印10条记录,如下:

                     


      实例2:使用实现Runnable接口方式

        实现Runnable接口的类:      

    public class MultiThread1 implements Runnable {
    
        private int ticket = 10;//每个线程都拥有10张票
        private String name;
    
        MultiThread1(String name) {
    
            this.name = name;
    
        }
    
        public void run() {
    
            while (ticket > 0) {
    
                System.out.println(ticket-- + " is saled by " + name);
    
            }
    
        }

       测试类:     

    public static void main(String[] args) {
    
            MultiThread1 m1 = new MultiThread1("Window 1");
            MultiThread1 m2 = new MultiThread1("Window 2");
            MultiThread1 m3 = new MultiThread1("Window 3");
            //创建3个线程
            Thread t1 = new Thread(m1 );
            Thread t2 = new Thread(m2);
            Thread t3 = new Thread(m3);
    
            t1.start();
            t2.start();
            t3.start();
    
        }

       测试结果同实例1

       通过以上两个实例,来看一下两者的相同之处:

         都可以保证新建线程彼此相互独立,各自拥有资源,互补干扰。在这样的场景先,无论使用哪种形式都可以。

       不同之处:

         java的一个特性是仅支持单继承,这样如果是通过继承Thread来实现多线程时,该类将无法再扩展其他的类,不能实现负责的功能。而使用实现Runnable接口时,同样还可以实现其他的接口,这样就避免单继承所带来的局限。还有一点是,实现Runnable接口创建的线程还可以处理同一资源,实现资源的共享。

      实例3:多个售票窗口可以共同售10张票   

    public class MultiThread2 implements Runnable {
    
        private int ticket = 10;
    
        @Override
        public void run() {
            while (ticket > 0) {
                System.out.println(ticket-- + " is saled by " + Thread.currentThread().getName());
    
            }
    
        }
    }
    

      测试类:    

    public static void main(String[] args) {
    
            //创建一个实例
            MultiThread2 m = new MultiThread2();
            //创建三个线程,三个线程共同拥有同一个实例
            Thread t1 = new Thread(m, "Window 1");
            Thread t2 = new Thread(m, "Window 2");
            Thread t3 = new Thread(m, "Window 3");
    
            t1.start();
            t2.start();
            t3.start();
    
        }

       实例结果:

         


     总结:

     采用继承Thread类方式:
     (1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
     (2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
     采用实现Runnable接口方式:
     (1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况。
     (2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。

  • 相关阅读:
    SQL PASS 北京2013年6月15日活动照片集
    XML约束文档DTD
    内存管理之虚拟页式分配
    设备驱动中异步通知编程
    王家林 云计算分布式大数据Hadoop实战高手之路第七讲Hadoop图文训练课程:通过HDFS的心跳来测试replication具体的工作机制和流程
    安装配置netanalyzer/netsnmp3.5.7_rc1
    理解Java对象序列化——Serializable接口
    世界500强高频逻辑推理智力面试题(二)
    2column left navigation 中遇到的问题
    Visual Studio 2010 无法打开 源 文件 "iostream.h"
  • 原文地址:https://www.cnblogs.com/victor-grace/p/7253610.html
Copyright © 2011-2022 走看看