(三)多线程说学逗唱:村口的老R头是个扫地僧(Runnable)

  • 上一篇我们讲到Thread这个类以及简单地说了下线程执行的随机性,相信大家对线程的使用有了不小的了解…
    在这里插入图片描述

  • 继承Thread接口是实现多线程的方式之一我相信你已经将这内功熟记于心,这一招式也外化于形了,但是这种方式在任何情况下都能够派上用场的吗??非也,他可不是程咬金的三板斧、万金油…对Java继承有一定了解的玩家都知道,在Java中有一个很大的特点,那就是:单根继承,也就是说你只能有一个爸爸,咱不能学吕布做三姓家奴不是。如果打算创建的线程类已经继承了某一个类了,这时候就不能够再次继承Thread类了(是不是很悲伤…),因此遇到这种情况必然需要变换招式了,Java就提供了这第二种招式,实现Runnable接口,瞧着,这老R头正在村口等着你嘞…
    在这里插入图片描述

  • 前面一篇文中我简单列举了下Thread的构造方法,这里呢我就着重带大家看看上图中的两个,很显然的这两个都可以传入Runnable接口,这说明构造函数支持传入一个实现了Runnable接口的对象。这样一来,既然已经继承了类的对象无法继承Thread类,那么换一个思维,先用一个类实现Runnable接口,在将该类作为参数传入Thread,这不就间接地创建了一个线程类吗!!设计师真是个天才。我们接下来来看Runnablel接口,该接口只有一个抽象方法run,不用多说实现Runnable接口必然要实现run方法
    在这里插入图片描述

package day01;
/**
 * 
* @ClassName: UseRunnable
* @Description: 学习创建线程的第二种方式:实现Runnable接口,
* 	同时学习一些线程中的细节:
* 		1)实现Runnable接口能够弥补java单根继承的短板,让已经继承了其他类的类也能够实现多线程
* 		2)Thread类也实现了Runnable接口,也就是说Thread(Runnable target)该构造函数不但可以传入
* 			实现了Runnable接口的类,也可以传入一个Thread类,能够将Thread类中的run方法交由其它的线程进行调度。
* @author Jian.Wang
* @date 2018年12月6日
*
 */
public class UseRunnable {
	private static final String MY_RUNNABLE_CLASS_NAME = "runnable_thread";
	private static final String MY_THREAD_CLASS_NAME = "thread_thread";
	
	public static void main(String[] args) {
		MyRunnable myRunnable = new MyRunnable();
		MyThreadTest myThreadTest = new MyThreadTest();
		
		Thread runnable_thread = new Thread(myRunnable,MY_RUNNABLE_CLASS_NAME);
		Thread thread_thread = new Thread(myThreadTest,MY_THREAD_CLASS_NAME);
		
		runnable_thread.start();
		thread_thread.start();
		System.out.println("Main:" + Thread.currentThread().getName());
	}

}

/**
 * 
* @ClassName: MyRunnable
* @Description: 线程类,通过实现Runnable接口创建
* @author Jian.Wang
* @date 2018年12月6日
*
 */
class MyRunnable implements Runnable{
	@Override
	public void run() {
		System.out.println("MyRunnable: 这是一个实现了Runnable接口的多线程类......");
		System.out.println("MyRunnable:" + Thread.currentThread().getName());
	}
	
}

/**
 * 
* @ClassName: MyThreadTest
* @Description: 线程类,通过继承Thread类创建
* @author Jian.Wang
* @date 2018年12月6日
*
 */
class MyThreadTest extends Thread{
	@Override
	public void run() {
		System.out.println("MyThred: 这是一个继承了Thread类的多线程类.......");
		System.out.println("MyThred:" + Thread.currentThread().getName());
	}
	
}


  • MyRunnable 类实现了Runnable接口,并实现了run方法,这里方法中只是简单地打印了下一条一句话和该线程的名字,然后在UseRunnable 类中通过MyRunnable myRunnable = new MyRunnable()创建了MyRunnable 实体,接着调用Thread的够着方法Thread(myRunnable,MY_RUNNABLE_CLASS_NAME)将Runnable的实体对象传入进去,并直接给线程一个名称,随后调用start()方法启动线程,这样第二种实现多线程的方式就实现了,是不是特别简单??
  • 有些看官可能就会问了,上面代码中还有一些代码是什么意思呢?别急,等我慢慢道来,首先先看我给大家看过的图。
    在这里插入图片描述
  • 说实话,本学渣也是第一次注意到Thread.java类也实现了Runnable接口,那就意味着够着函数Thread(Runnable target)不光可以传入Runnable接口的对象,还可以传入一个Thread类的对象,这样一来就完全可以将一个Thread对象中的run()方法交由其他线程进行调用。于是我创建了MyThreadTest 类继承了Thread,以上一种同样的方式作为参数传递,放在一起进行比较,得出了下面的运行结果,哈哈,收获了新东西(开心)。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/WJHelloWorld/article/details/84871534