Java 多线程《II》— 启动线程的三种方式和源码分析

Posted 王睿丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 多线程《II》— 启动线程的三种方式和源码分析相关的知识,希望对你有一定的参考价值。


嗨,好长时间没跟大家见面啦,总算挑出点时间写文章了,写一下多线程吧,后面还会继续更新,文章内容若有问题请指出,万分感谢!好啦,下面就开始今天的课程吧!

1、继承 Thread

实现

class MyThread extends Thread{
	@Override
	public void run() {
		System.out.println("我继承了Thread类");
	}
}
	public static void main(String[] args) {
		MyThread thread1 = new MyThread();
		thread1.start();
	}

运行结果:

源码分析

Thread 源码
通过创建对象,去初始化一个线程,但它此时并没有启动。

Thread 源码
实现了 Runnable 接口,但是我们要记住一点,Runnable 它只是一个接口,它并不能去操作一个线程,当然也就不能去启动线程了。

2、实现 Runnable

实现

class MyRunnable implements Runnable{
	@Override
	public void run() {
		System.out.println("我实现了Runnable接口");
	}	
}
	public static void main(String[] args) {
		Thread thread2 = new Thread(new MyRunnable());
		thread2.start();
	}

运行结果:

源码分析

Runnable 源码
run 方法是一个抽象方法,它的作用是用来执行线程执行逻辑的。所以需要线程做什么,我们可以在这里面写。

Thread 源码
接收一个 Runnable 接口对象从而完成线程初始化

3、实现 Callable

实现

class MyCallable implements Callable<String>{
	@Override
	public String call() throws Exception {
		System.out.println("我实现了Callable接口");
		return "执行完毕";
	}
}
public static void main(String[] args) {
	FutureTask<String> futureTask = new FutureTask<String>(new MyCallable());
	Thread thread3  = new Thread(futureTask); 
	thread3.start();
	try {
		System.out.println("Callable 线程的返回结果:" + futureTask.get());
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (ExecutionException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

运行结果:

源码分析

(1)Callable 接口是一个泛型接口,所以在实现的时候需要指定它的类型
(2) call() 方法是有返回值的

然后我们再去查看一下 Thread 源码,并找不到关于 Callable 的任何信息,那我们怎么去启动线程呢?这时候就出现了 FutureTask

FutureTask 源码
可以发现 public FutureTask(Callable callable) 接收一个 Callable 对象

然后我们又发现 FutureTask 实现了 RunnableFuture

接着跟踪 RunnableFuture

RunnableFuture 源码
发现 RunnableFuture 也是实现了 Runnable 接口,这下终于明白为什么 Callable 接口也能实现启动线程了吧!

讲到这,还没完,请大家看一下黄色箭头所指的地方,它是一个逗号,这是什么意思呢?
答:其实这就是Java中的多实现,大家肯定都知道Java 不支持多继承,但它却可以多实现接口,所以这里用逗号来隔开。

好啦,那么本期就讲到这里,如果有小伙伴喜欢请关注我,多线程及更多精彩内容,将会持续更新,下期见~

上一篇:Java 多线程《I》— 并发、并行、线程、多线程、进程

下一篇:制作中

以上是关于Java 多线程《II》— 启动线程的三种方式和源码分析的主要内容,如果未能解决你的问题,请参考以下文章

java核心学习(二十一) 多线程---创建启动线程的三种方式

JAVA多线程实现的三种方式

多线程的三种实现方式

java 并发多线程 : 主线程等待子线程结束的三种方式:join / CountDownLatch / CyclicBarrier

JAVA多线程实现的三种方式

JAVA笔记(19)--- 线程概述;如何实现多线程并发;线程生命周期;Thread常用方法;终止线程的三种方式;线程安全问题;synchronized 实现同步线程模型;