多线程——继承Thread 类和实现Runnable 接口的区别

Posted 邵鸿鑫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程——继承Thread 类和实现Runnable 接口的区别相关的知识,希望对你有一定的参考价值。

  java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点:

  首先,java只能单继承,因此如果是采用继承Thread的方法,那么在以后进行代码重构的时候可能会遇到问题,因为你无法继承别的类了。

  其次,如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。

  通过下面的实例可以清晰的看出两种方式的区别所在。

1.继承Thread 类

package test;
/**
 * 继承thread类
 * @author hongxin
 *
 */
public class testThread extends Thread
	private int count=5;
	private String name;
    public testThread(String name) 
       this.name=name;
    
	public void run() 
        for (int i = 0; i < 5; i++) 
            System.out.println(name + "运行  count= " + count--);
            try 
                sleep((int) Math.random() * 10);
             catch (InterruptedException e) 
                e.printStackTrace();
            
        
       
	

package test;

public class main1 
	public static void main(String[] args) 
		testThread mTh1=new testThread("A");
		testThread mTh2=new testThread("B");
		mTh1.start();
		mTh2.start();
	

运行结果

代码分析

  线程1和线程2之间的变量是不能共享的,每次count--都有各自的变量和结果。

2.Runnable 接口

package test;

/**
 * 实现runnable接口
 * @author hongxin
 *
 */
public class testRunnable implements Runnable
    private int count=15;
	@Override
	public void run() 
		  for (int i = 0; i < 5; i++) 
			  System.out.println(Thread.currentThread().getName() + "运行  count= " + count--);
	            try 
	            	Thread.sleep((int) Math.random() * 10);
	             catch (InterruptedException e) 
	                e.printStackTrace();
	            
	        
	
	

package test;

public class main2 
	public static void main(String[] args) 
		testRunnable mTh = new testRunnable();
	        new Thread(mTh, "C").start();//同一个mTh,但是在Thread中就不可以,如果用同一个实例化对象mt,就会出现异常   
	        new Thread(mTh, "D").start();
	        new Thread(mTh, "E").start();
	



运行结果

代码分析

  三个不同的线程之间的变量是共享的,每次count--得到的记过都是再上一个线程运行结果之上得到的。

以上是关于多线程——继承Thread 类和实现Runnable 接口的区别的主要内容,如果未能解决你的问题,请参考以下文章

题目24-多线程两种实现方式

多线程实现的3种方式

多线程之Tread类和Runnable的区别

多线程学习记录一继承Thread类和实现Runnable接口Callable接口的区别

Java 多线程

Java多线程学习笔记— “建立线程的两种方法 (Thread类和Runnable接口)”