首页 > 其他分享 >多线程

多线程

时间:2022-09-26 15:22:16浏览次数:43  
标签:执行 run 创建 sleep 线程 多线程 wait

1. 线程和进程区别

线程的划分尺度小于进程,这使多线程程序拥有高并发性,进程在运行时各内存单元之间相互独立,线程之间内存共享,这使多线程拥有更好的性能和用户体验。

  • 线程

是进程的一个实体,是 cpu 调度和分派的基本单位,是比进程更小的可以独立运行的基本单位。

  • 进程

具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个基本单位。

2. 创建线程方式

  • 继承 Thread 类重写 run(),简单单一,不能继承其他类。
  • 实现 Runnable 接口重写 run(),避免单继承局限性,灵活解耦。
  • 实现 Callable 接口重写 call(),可以获取返回值,可以抛出异常。
  • 线程池创建,Executor 接口。

3. Runnable 和 Callable 区别

  • Runnable 无返回值;Callable 有返回值,支持泛型。
  • Runnable 只能抛出运行时异常,且不能捕获;Callable 反之。

4. start() 和 run() 区别

start() 可以启动线程,使线程进入就绪状态;run() 只是 Thread 的一个普通方法,在主线程中执行。

5. 线程的状态

  • 新建

生成线程对象

  • 就绪

调用了 start()

  • 运行

将就绪状态的线程设为当前线程,运行 run()

  • 阻塞

线程因为某种原因放弃 cpu 使用权,暂时停止运行,直到线程重新进入到就绪状态,才有机会转到运行状态。

    • 等待
    • 调用 wait() 使线程等待某工作完成 
    • 超时等待
    • 调用 sleep() 或 join() 或发出了 I/O 请求,线程进入阻塞状态,当 sleep() 状态超时、join() 等待线程终止或超时、I/O 处理完毕,线程重新进入就绪状态。 
    • 同步阻塞
    • 线程获取 synchronized 同步锁失败 
  • 死亡

线程执行完毕或异常退出,线程结束生命周期

6. 线程相关方法

  • 线程等待(wait)

调用该方法的线程进入 waiting 状态,等待其他线程通知或被中断才会返回,会释放锁,一般用于同步方法或同步代码块中。

  • 线程睡眠(sleep)

导致线程进入 time-waiting 状态,不会释放当前持有的锁。

  • 线程让步(yield)

使当前线程让出 cpu 执行权,与其他线程重新竞争。

  • 线程中断(interrupt)

本意是给线程一个中断的信号,会影响线程内部的一个中断标识位,线程本身并不会因此而改变状态。

  • 线程加入(join)

使线程执行完 run() 方法后,再执行 join() 方法后面的代码。

  • 线程唤醒(notify)

随机唤醒等待的单个线程,notifyAll() 唤醒所有线程。

7. wait() 和 sleep() 区别

  • wait() 来自 Object 类;sleep() 来自 Thread 类。
  • wait() 会释放锁;sleep() 不会。
  • wait() 必须在同步方法或同步代码块中使用;sleep() 任何地方可用。
  • wait() 不需要捕获异常;sleep() 需要。

8. 线程池优点

  • 使用线程池可以重复使用已有线程,避免了线程在创建和销毁所造成的损耗
  • 没有创建和销毁的损耗,提高了系统响应速度
  • 对线程进行管理,如根据系统承受能力调整可运行线程数量大小等

9. 线程池分类

  • newCachedThreadPool

创建一个带缓存可重复利用的线程池

  • newFixedThreadPool

创建一个可重用、固定线程数量的线程池

  • newSingleThreadExecutor

创建一个单线程的线程池

  • newScheduledThreadPool

创建一个线程池,支持延时和定期执行

10. 线程池的核心参数

  • corePoolSize:核心线程数
  • maximumPoolSize:最大线程数
  • keepAliveTime:空闲线程存活时间
  • unit:时间单位
  • workQueue:阻塞队列
  • threadFactory:创建线程的工程
  • handler:拒绝策略

11. 线程池原理

当一个任务提交至线程池,首先判断核心线程数是否已满,没有则创建线程执行任务;否则放入阻塞队列,如果阻塞队列已满,判断最大线程数是否已满,没有则创建线程执行;否则将执行拒绝策略。

12. 拒绝策略

  • AbortPolicy

系统默认,丢弃任务并抛 RejectedExecutionException 异常

  • DiscardPolicy

丢弃任务,不抛异常,可能造成数据丢失

  • DiscardOldestPolicy

丢弃最前面的任务(通常是存活时间最长的任务),并尝试重试执行,也有数据丢失风险

  • CallerRunsPolicy

既不丢弃任务,也不抛异常,而是将某些任务回退给调用者,让调用者去执行

13. 线程池关闭

  • shutdownNow

首先将线程池状态设置为 stop,然后尝试停止所有正在执行和未执行的线程,并返回等待执行任务列表

  • shutdown

将线程池状态设置为 shutdown,然后中断所有未执行的线程

标签:执行,run,创建,sleep,线程,多线程,wait
From: https://www.cnblogs.com/apachewang/p/16730910.html

相关文章

  • 【转载】Python -- 多进程、多线程 的基本使用
    https://www.cnblogs.com/jiyu-hlzy/p/15948408.html 单进程单线程importtimedefproduction():"""间隔一秒,模拟一秒生产一个任务,生产10个任务:ret......
  • Java多线程
    join()方法使用:【已经开了3个线程ABC,要求线程A在线程B的前面执行,线程B在线程C的前面执行】https://blog.csdn.net/zds448588952/article/details/99613648......
  • 多线程——Robyn编程学习(Java)
    多线程的作用能够创建多个线程,此外线程可以体现程序的动态性,提高效率,在抢票以及各种游戏之中具有非常重要的作用。(线程的魅力在坦克大战中体现的淋漓尽致)多线程的知识体......
  • 多线程批量删除后再查询所遇到的坑
    问题:以前对于多线程异步执行没有细想,认为已经采用的countdownlatch,保证了任务全部执行完毕。实际上,并不是我认为的那样。首先,一个方法是多线程异步批量删除数据,另一个方......
  • Day11 多线程的学习,线程一些方法的使用
    Day11多线程的学习线程休眠sleep的使用sleep可以模拟网络延迟和倒计时。模拟网络延迟在线程中使用Thread.sleep()方法,能够放大问题的发生性,能更好的把握问题所在。比......
  • ExecutorService、Callable、Future实现有返回结果的多线程原理解析
    原创/朱季谦在并发多线程场景下,存在需要获取各线程的异步执行结果,这时,就可以通过ExecutorService线程池结合Callable、Future来实现。我们先来写一个简单的例子——publ......
  • UEC++ 多线程(一) FRunnable
    虚幻官方文档:https://docs.unrealengine.com/5.0/en-US/API/Runtime/Core/HAL/FRunnable/FRunnable“runnable”对象的接口。可运行对象是在任意线程上“运行”的对象......
  • 对多线程原子性的理解
    多线程原子性的理解:一个操作要么全部执行完毕,不会受到干扰而被中断;要么全都不执行。对于多线程中操作共享变量的操作,要保证它的原子性。在一个类中有共享变量count,开启......
  • Day8 多线程基础概念的学习
    Day8多线程学习多线程多任务任务就是需要完成的一件事,多任务可能在同一时间解决,或者按步一个一个解决。通过多条道路解决原来一条道路堵塞的问题,多线程。就是同一时......
  • Java多线程
    多线程详解(Java.Thread)线程简介线程实现(重点)线程状态线程同步(重点)线程通信问题高级主题多任务:现实中太多这样同时做多件事情的例子了,看起来是多个任务都在做,其实本......