多线程--Thread和Runnable区别

Posted 走出自己的未来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程--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()方法。

以上是关于多线程--Thread和Runnable区别的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程:Runnable和Thread实现多线程的区别(含代码)

并发编程之多线程基础-Thread和Runnable的区别及联系

Thread和Runnable的区别和联系多次start一个线程会怎么样

多线程——Thread与Runnable的区别

callable和runnable的区别

callable和runnable的区别