IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java 多线程《II》— 启动线程的三种方式和源码分析 -> 正文阅读

[Java知识库]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知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:02:26  更:2021-09-06 11:02:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:13:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码