多线程小笔记
多线程
多线程并不能提高程序的运行速度,但是能够提高程序运行效率,让cpu的使用率更高。
进程与线程
进程:是一个内存中运行的应用程序
线程:是进程中的一个执行路径,线程有自己的栈空间
同步与异步(线程安全和不安全)
同步:排队执行,效率低但是安全
异步:同时执行,效率高但是数据不安全
并发与并行
并发:指两个或多个事件在同一个时间段内发生
并行:指两个或多个事件在同一个时刻(同时)发生
实现Runnable与继承Thread相比有以下优势:
1、通过创建任务,然后给线程分配的方式来实现多线程,更适合多个线程同时执行相同任务的情况。
2、可以避免单继承所带来的局限性。
3、任务与线程本身分离,提高了程序的健壮性。
4、线程池技术,接收Runnable类型的任务,不接受Thread类型的线程。
线程等待和线程阻塞(也称为耗时操作)
Interrupt()方法:
如果调用了相关的能触发InterruptedException的方法,程序会检查是否有Interrupt()方法标记,如果有则进入异常,然后在异常中通过return进行停止操作
守护线程
调用setDaemon(true)转为守护线程,随被守护线程的死亡而死亡
线程安全(三种方式):
1、synchronize代码块,指定同一把锁,实现同步
2、synchronize方法,在方法返回类型前声明,实现同步方法
3、显式锁,建立Lock对象,自己在指定位置添加上锁和解锁方法,实现同步。
公平和非公平锁
Lockl=newReentrantLock(true);参数为true(默认为false),表示是公平锁,先到先得
多线程通信问题:生产者和消费者
This.notifyAll() 唤醒其他线程
This.wait() 当前线程休眠
当生产者生产时,不让消费者消费
当消费者消费时,不让生产者生产,这样才不会导致线程错乱,线程之间有序排队进行。
线程六种状态
NEW 线程刚创建还未启动
RUNNABLE 运行
BLOCKED 阻塞
WAITING 无期限等待
TIMED WAITING 计时等待
TERMINATED 已退出线程的状态
java线程的三种实现方式:
1、继承Thread,创建线程
2、创建任务对象(实现Runnbale),加入线程中
3、带返回值的线程Callable
Callable<> c =newMyCallable();
FutureTask<> futureTask = new FutureTask<>(c);
newThread(futureTask).start();
futureTask.isDone() 判断线程是否执行完毕
futureTask.cancel(); 取消任务
四种线程池
1、缓存线程池
ExecutorService es = Executors.newCachedThreadPool();
长度无限制。
先判断池中是否有空闲线程,存在则使用,不存在则创建线程并放入池中,然后使用。
2、定长线程池
ExecutorService es = Executors.newFixedThreadPool(2);
3、单线程线程池
ExecutorService es = Executors.newSingleThreadExecutor();
4、周期定长线程池
先判断池中是否有空闲线程,存在则使用,不存在空闲线程,且线程池未满的情况下,则创建线程并放入池中,然后使用。
(1)定时执行一次
ScheduledExecutorService es = Executors.newScheduledThreadPool(2);
es.schedule( new Runnable(){} ,定时多长时间的数字 ,定时的时间单位TimeUtil.SECONDS)
es.scheduleAtFixedRate( new Runnable(){}
,延迟多长时间
,周期运行的间隔数字
,定时的时间单位TimeUtil.SECONDS)
lambda表达式
()->
只保留匿名的方法体和它的参数线程