Java并发编程

线程和进程

线程和进程

线程的创建——Java多线程相关

线程的创建

Thread类代表线程,一般采用实现接口的方式创建线程。

  • 继承Thread类,重写run()方法。run()称之为线程执行体。
  • 实现Runnable接口,重写run()方法。然后将该实现类的实例作为Thread类的target创建线程。
  • 使用Callable和Future接口创建线程。创建Callable实现类实现call()方法,FutureTask类包装Callable实现类,并作为Thread对象的target创建线程,这里call()为线程执行体。
    【Thread类中的run()方法调用的是Runnable接口中的run()方法,也就是说此方法由Runnable子类完成,所以通过继承Thread类实现多线程必须覆写run()。实现Runnable可以更加方便的实现资源的共享】

Java多线程(包括创建、状态等)

线程的终止

  • stop()方法:但是基本已经被废弃,因为用该方法时会强行结束而不会释放资源。
  • 用boolean类型标记变量,标记是否被中断
  • 用Thread.isInterrupted()
  • 使用中断机制

关于线程的终止

线程的安全性以及解决办法

  • 原子性:一个或多个操作在CPU执行的过程中不断被中断的特性。——线程切换导致
    • 解决办法:JDK Atomic开头的原子类、synchronized、LOCK
  • 可见性:一个线程对共享变量的修改,另一个线程能够立刻看到。——缓存导致
    • 解决办法:synchronized、volatile、LOCK
  • 有序性:程序执行的顺序按照代码的先后顺序执行。——编译优化导致
    • 解决办法:Happens-Before规则

用户线程和守护线程

守护线程

  • 守护线程是程序运行的时候在后台提供一种通用服务的线程。所有用户线程停止,进程会停掉所有守护线程,退出程序。
  • Java中把线程设置为守护线程的方法:在 start 线程之前调用线程的 setDaemon(true) 方法。

并发的优缺点

优点

  • 硬件的单元计算能力提升受限;硬件上提高了CPU的核数和个数,并发编程可以提升CPU的计算能力的利用率
  • 提升程序的性能,如响应时间、吞吐量、计算机资源使用率等
  • 并发程序可以更好地处理复杂业务,对复杂业务进行多任务拆分,简化任务调度,同步执行任务

缺点

  • Java 中的线程对应是操作系统级别的线程,线程数量控制不好,频繁的创建、销毁线程和线程间的切换,比较消耗内存和时间。
  • 容易带来线程安全问题。如线程的可见性、有序性、原子性问题,会导致程序出现的结果与预期结果不一致。
  • 多线程容易造成死锁、活锁、线程饥饿等问题。此类问题往往只能通过手动停止线程、甚至是进程才能解决,影响严重。
  • 对编程人员的技术要求较高,编写出正确的并发程序并不容易。
  • 并发程序易出问题,且难调试和排查;问题常常诡异地出现,又诡异地消失。

线程池

线程池的原理实现

  • 线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程。
  • 线程池判断工作队列是否已经满。如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。
  • 线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。
    在这里插入图片描述

线程池的原理实现

线程池的类型

  • newFixedThreadPool——固定大小线程池
    线程池可产生的线程数固定,达固定容量后不会产生新的线程,除非等旧线程出现问题,则会产生新的线程处理新的任务
  • newCachedThreadPool——可缓存线程池
    线程池没有固定容量,会自动回收空闲线程,等任务增加再自动添加新线程完成任务
  • newScheduledThreadPool——定长线程池可执行周期性任务
    容量固定,能生成的线程数有限,但可以周期的产生线程执行新的任务
    • scheduleWithFixedDelay 固定的延迟时间执行任务;
    • scheduleAtFixedRate 固定的频率执行任务。
  • newSingleThreadExecutor——单线程线程池
    当线程异常结束时,会创建一个新的线程,继续按顺序执行后面的任务。
  • newSingleThreadScheduledExecutor——单线程可执行周期性任务的线程池。
    • scheduleWithFixedDelay 固定的延迟时间执行任务;
    • scheduleAtFixedRate 固定的频率执行任务
  • newWorkStealingPool——任务可窃取线程池
    空闲线程可以窃取其他任务队列的任务,不保证执行顺序,适合任务耗时差异较大。

AQS

这里是引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值