思维导图-多线程
2020-07-05 10:31:48 35 举报
AI智能生成
关于Java多线程思维导图整理
作者其他创作
大纲/内容
JAVA多线程
1.多线程基础
线程与进程
三种实现多任务的方式多进行VS多线程VS混合模式
运行顺序:
JVM启动主线程执行main()方法
在main方法中启动其他线程
2.创建新线程
两种方法
创建`Thread`实例时,传入一个`Runnable`实例
4.已有的单个线程 相关
线程本身的状态
总的来说:
线程总共状态:6种
线程等待: t.join()
Thread.sleep(20)
模拟并发执行的效果
这种方式是不能够确保一定先被执行的
中断线程
只是提出中断请求
提出中断请求后的中断响应
1.在线程的run()代码种使用while循环检查isInterrupted()
2.中断标志位
在从Thread派生出线程子类的时候用关键字volatilepublic volatile boolean running = true;同样在run()种使用while()
volatile定义的变量是线程间共享的
对处于t.join()的t线程执行t.interrupt()
t线程会立刻抛出InterruptedException
守护线程
Thread t = new MyThread();t.setDaemon(true);t.start();
JVM退出时,不必关心守护线程是否已结束
5.多个线程之间的问题
基础
需要保证一组指令以\"原子\"方式执行
\"临界区\"
概念:线程安全VS非线程安全
概念:可重入锁
一个线程可以多次获取同一个锁
需要对类的方法进行同步称为:同步方法对this加锁
例子:一个具有增加和减少方法的计数Counter类
两种类的方法
普通类方法
类的静态方法
死锁:两个线程之间
两个线程各自持有不同的锁,然后各自试图获取对方手里的锁,造成了双方无限等待
各种锁
synchronized
多线程协调的问题没有解决
问题描述
多线程协调运行的原则
当条件不满足时,线程进入等待状态;当条件满足时,线程被唤醒,继续执行任务
解决办法
wait()和notify()方法
使用要点
在synchronized内部调用wait();notify()或notifyAll()
必须在已获得的锁对象上调用wait();notify()或notifyAll()方法;
ReentrantLock
java代码实现的锁
类的private字段中定义private final Lock lock = new ReentrantLock();
基本使用
实现多线程的协调
实现类似于synchronized锁的wait()和notify()功能
通过锁的 condition 对象(要绑定Lock实例)
private final Lock lock = new ReentrantLock();private final Condition condition = lock.newCondition();
condition的方法(与synchronized类似)
await()会释放当前锁,进入等待状态;
signal()会唤醒某个等待线程;
signalAll()会唤醒所有等待线程;
ReadWriteLock读写锁(悲观读锁)
特点
只允许一个线程写入
允许多个线程在没有写入的时候同时读取
适合读多写少
适用条件
同一个数据,有大量线程读取,但仅有少数线程修改。
例子:一个论坛的帖子,回复可以看做写入操作,它是不频繁的,但是,浏览可以看做读取操作,是非常频繁的,这种情况就可以使用ReadWriteLock
创建一个ReadWriteLock实例,分别获取读锁和写锁
private final ReadWriteLock rwlock = new ReentrantReadWriteLock();private final Lock rlock = rwlock.readLock();private final Lock wlock = rwlock.writeLock();
StampedLock读写锁(乐观读锁)
相较于ReadWriteLock读的过程中也允许获取写锁后写入
类内部字段private final StampedLock stampedLock = new StampedLock();类的方法中:long stamp = stampedLock.tryOptimisticRead(); // 获得一个乐观读锁
典型类的读代码需要查验锁的版本号是否一致
Concurrent集合
描述:
Java标准库的java.util.concurrent包提供的线程安全的集合(并发集合类)
常见的集合对应的线程安全集合
使用:
与使用非线程安全的集合类完全相同
Atomic包
描述
提供了一组原子操作的封装类
位于java.util.concurrent.atomic包
线程池
接收大量小任务并进行分发处理
使用
普通线程池
接口:ExecutorService
类:Executors
创建线程池(类的静态方法)
FixedThreadPool:线程数固定的线程池;
CachedThreadPool:线程数根据任务动态调整的线程池;
SingleThreadExecutor:仅单线程执行的线程池。
向线程池中提交
例如线程Taskes.submit(new Task(\"\" + i));
创建定时反复线程池ScheduledThreadPool
接口:ScheduledExecutorService
创建线程池(类的方法)
ScheduledExecutorService ses = Executors.newScheduledThreadPool(4);
向线程池中提交(三种定时方式)
ses.schedule()执行一次
ses.scheduleAtFixedRate()固定时间间隔触发
ses.scheduleWithFixedDelay()上一次任务执行完毕后,等待固定的时间间隔,再执行下一次任务
向线程池中提交任务
Runnable任务
Callable任务
Callable接口是一个泛型接口,可以返回指定类型的结果
获得异步执行的结果
ExecutorService executor = Executors.newFixedThreadPool(4);
// 定义任务:(给出任务的返回值类型)Callable<String> task = new Task();
// 提交任务并获得Future对象:Future<String> future = executor.submit(task);
// 从Future获取异步执行返回的结果:String result = future.get(); // 可能阻塞
Future对象的方法
get():获取结果(可能会等待)
cancel(boolean mayInterruptIfRunning):取消当前任务;
isDone():判断任务是否已完成。
0 条评论
回复 删除
下一页