Java多线程基础----思维导图
下载地址: https://download.csdn.net/download/q863672107/20016460
以下是自动转换的MakeDown文本
多线程
单核CPU执行任务时, 单线程的执行速度比多线程(线程切换)更快
一个Java进程至少有三个线程: main, GC, 异常处理
多线程的优点:
1.提高应用程序的响应。对图形化界面更有意义, 可增强用户体验(同时执行多个任务)。
2.提高计算机系统CPU的利用率, 减少CPU空闲。
3.改善程序结构, 将既长又复杂的进程分为多个线程, 独立运行, 利于理解和修改。
何时需要多线程:
程序需要同时还行多个任务
程序需要实现一些需要等待的任务时, 如用户输入, 文件读写, 网络操作, 搜索等。
需要一些后台运行的程序时。
线程的创建和使用
创建
在开发中, 优先选择实现接口的方式
1.单继承的局限性
2.继承的方式导致多线程需要创建多个子类对象, 多线程共享的属性需要手动声明为static, 而继承Runnable接口可以通过同一个实现类对象创建多个Thread对象, 可以天然地实现属性共享。
联系:
Thread类本身实现了Runnable接口, 继承Thread类间接实现了Runnable接口
两者都要重写run方法, 将多线程运行逻辑写到run方法中
-
继承Thread类
- 创建Thread类的子类对象(重写run方法)
-
实现Runnable接口
-
- 创建Runnable接口的实现类对象(实现run方法), 并传入Thread类构造器
- 2.创建Thread类对象(start()后实际调用实现类对象的run方法)
-
使用
-
启动多线程
-
启动方式一
- 创建继承/实现类
- 重写run()方法
- start()方法启动线程
-
启动方式二
-
-
常用方法
-
线程设置
- String getName()
- void setName(String neme)
- static Thread currentThread()
-
线程通信
-
void join()
-
线程插队
在线程a中调用线程b的join()方法, 此时线程a就进入阻塞状态, 直到线程b执行完以后, 线程a才结束阻塞状态。
-
-
static void yield()
-
线程让步
释放当前cpu时间片
实际有可能释放后又获取到时间片, 继续执行当前线程
-
-
static void sleep(long millis)
-
线程睡眠
当前线程睡眠指定的millis毫秒数
在指定的毫秒时间内, 当前线程是TIMED_WAITING状态, 不会释放锁和cpu资源
-
-
void stop()
- 强制结束线程生命周期
-
boolean isAlive()
- 判断线程是否活着
-
-
Object类的方法
锁机制下使用- wait()
- notify()
- notifyAll()
-
JDK5 新增线程创建方式
实现Callable接口
相比于Runnable Callable的功能更强大些
相比于run方法, call可以有返回值
方法可以跑出异常
支持泛型的返回值
需要借助FutureTask类, 比如获取返回结果
-
启动方式一
-
Future接口
可以对具体Runnable, Callable任务的执行结果进行取消, 查询是否完成, 获取结果等。
结果只能在计算完成时使用方法get进行检索,必要时阻塞。 cancel方法执行取消操作。 提供了其他方法来确定任务是正常完成还是被取消。 一旦计算完成,就不能取消计算。如果只是为了可取消而使用Future,而不需要返回结果,可以声明Future<?>,并return null作为底层任务的结果。
FutureTask是Future接口的唯一实现类
FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执行, 又可以作为Future得到Callable的返回值。 -
FutureTask类
-
1.创建一个Callable接口实现类
实现call()方法,可以有返回值,抛出异常 -
2.用FutureTask对Callable对象进行包装
(通过Callable对象创建FutureTask对象) -
3.用Thread包装FutureTask对象, 并启动线程
-
多个线程,需要通过Thread包装
多个FuturteTask对象CallableImpl callableImpl = new CallableImpl();
//FutureTask对象,还有Callable接口,通过泛型限定,否则call,get方法默认返回Object类型
FutureTask futureTask1 = new FutureTask<>(callableImpl);
FutureTask futureTask2 = new FutureTask<>(callableImpl);
//多线程start还是通过Thread类实现
new Thread(futureTask1, “线程1”).start();
//通过一个FutureTask只能创建一个线程
new Thread(futureTask2, “线程2”).start();
-
-
- 4.调用FutureTask的get()方法获取返回值
-
代码
/**
-
@author chenyao
-
@version v1.0
-
@desc
-
@create 2021/6/27 21:30
*/
public class CallableTest implements Callable {
@Override
public Integer call() throws Exception {
int sum
-
-
-