Java 多线程(二)启动线程的三种方式和源码分析
嗨,好长时间没跟大家见面啦,总算挑出点时间写文章了,写一下多线程吧,后面还会继续更新,文章内容若有问题请指出,万分感谢!好啦,下面就开始今天的课程吧!
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) {
e.printStackTrace();
} catch (ExecutionException e) {
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中数组转列表_Java数组转list
- JAVA多线程面试题_java多线程的实现方式
- java bufferedwriter 编码,Java BufferedWriter对象与utf-8
- java 二维数组 arraycopy_Java对数组的复制[通俗易懂]
- java工作流_Java 实现简单工作流
- java和c语言哪个简单_Java编程和C语言哪个好学
- Java XML XXE 底层防御
- 真正解决方案:java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
- 物业管理系统源码java_Java小区物业管理系统 源码报告下载
- 利用Hutool-(Java工具类)实现验证码校验
- java webservice接口开发教程_JAVA入门教程
- 反编译Java_java反编译的代码可以修改么
- Java学习笔记之六java三种循环(for,while,do……while)的使用方法及区别详解编程语言
- java如何使用AES加密详解编程语言
- Java经典实例:比较浮点数详解编程语言
- eeOracle放弃Java EE:梦想的终结(oracle放弃java)
- js,java,浮点数运算错误及应对方法详解编程语言
- Java多线程超详解编程语言
- Java多线程8:wait()和notify()/notifyAll()详解编程语言
- Java多线程2:Thread中的实例方法详解编程语言
- 数据库简易指南:如何使用 Java 连接 MySQL 数据库(java连接mysql)
- 如何在Linux系统中正确配置Java?(linux下配置java)
- MySQL之Java实现主从复制(java mysql主从)
- 学习Java编程,攻克Oracle难题(java学oracle)
- 查看Java所支持的语言及相应的版本信息
- java捕获异常信息存入txt文件示例
- java常用工具类之DES和Base64加密解密类