认识线程和线程池

1 什么是线程

1.1 线程

线程 是CPU执行的最小单位。计算机创建的每个进程中可以包含N个线程。Java(高级语言)通知JVM需要创建线程,JVM通过不同平台的不同指令通知计算机创建线程。

JAVA线程的6种状态: NEW,RUN(就绪、运行),WAIT,TIME_WAIT,BLOCKED,DEAD。
JAVA线程的6种状态

操作系统中线程的5种状态:操作系统中的线程没有NEW和DEAD两个概念;RUNNABLE,RUNNING,WAIT,TIME_WAIT,BLOCKED。

1.2 线程池

Java提供线程池的概念,可以在应用初始化后创建规定大小的线程池,每次使用从线程池拿到线程,使用完毕归还线程到线程池。达到更好的利用资源、管理资源、提高性能的作用(因为如果不使用线程池,直接创建线程的话,线程数难以控制,当线程达到一定数量后,CPU频繁切换上下文调度资源,增加负载,降低性能)。

2 线程的特性

异步 : 利用多线程,可以创建线程异步处理任务,提高响应速度,适应更多的业务场景。
并发 : 利用CPU的时间片,并发处理多个线程,提高性能 和 CPU的使用率。

3 线程的使用

3.1 创建/启动

实现Runnable接口的run方法。
继承Thread类并重写run方法。
实现Callable/Future 的call方法,带返回值。

Eg:
a) 直接New线程start:new Thread(() -> {xxxx}, “thread01”).start()
b) 使用线程池Submit一个thread: Executors.newFixedThreadPool(15).submit(threadName);
c) 使用线程池Submit一个callable的任务:
Future future = executorService.submit(callableName);
future.get() // get方法就是一种阻塞的,需要等到线程执行完后,get才能拿到返回数据。

3.2 阻塞

主动阻塞

a) Thread.wait(N)
b) Thread.sleep(N)
c) Thread.join(N)
d) LockSupport.parkUntil(N)

被动阻塞
synchronized等同步关键字修饰的资源,当多个线程访问到的时候,一个线程获取到资源,另一个线程就会被阻塞,等待资源释放后再获取资源。

3.3 通知/停止

Stop线程

  1. 不建议使用:Thead.stop()

中断通知(由线程自己运行停止)

  1. 使用interrupted() 方法将线程中断标志interrupt(默认为false,也就是不中断)置为true(通知线程中断停止)。
  2. 如果线程中存在一定时间阻塞,我们要在它阻塞时也能通知到线程停止,这时当jvm接收到interrupt=true后,会抛出InterruptedException异常,并将线程中断标志复位(=false),由线程内的try-catch(监视器)捕获该异常,并执行异常后的代码(可以继续interrupted()通知线程该中断了)。

4 线程的原理

主要还是由于操作系统和CPU对线程的支持;
JVM由C++代码实现Native方法和操作系统的资源管理;
JAVA调用JVM提供的Native接口方法管理线程,运行时调用RUN方法执行线程逻辑。

5 注意事项

  1. 合理使用线程,线程不是越多越好。
    使用 new ThreadPoolExecutor 或 Executors.newXXX 方法来创建线程池管理线程,不要用new Thread()方法创建线程。
  2. 注意线程安全问题。

6 并发编程简述

并发编程是CPU利用率的博弈

由于CPU-内存-硬盘之间存在速度差。所以分别引入了store buffer、store forwarding、cache、高速缓存等概念和功能。
由于缓存的出现,在多CPU多线程任务中共享数据的存在原子性、有序性、可见性等问题。

针对CPU数据处理的一致性问题,提出了MESI协议,用于解决缓存一致性问题。同时CPU提供Lock指令让程序员决定什么时候加锁,保证原子性问题。提供内存屏障指令来保证程序顺序执行,而不会因为CPU的优化导致指令重排序。

java中提供JMM内存模型,定义一组操作内存的规范,来保证共享数据的正确操作,主要体现在内存屏障命令的封装。

java中提供synchronized、volatile、final关键字来对数据操作加锁、增加内存屏障等功能。来保证多线程环境下的原子性、有序性、可见性。
1、synchronized关键字操作monitor监视器来监视和操作重量级锁的状态变化和通知,每一个对象都有一个monitor监视器。对象经过无锁(初始化状态)、偏向锁(单线程获取锁时)、轻量级锁(CAS自旋获取锁时的状态)、重量级锁(经过多次获取锁失败后,升级成重量级锁,并由monitor监视线程状态)。
2、volatile是JVM提供的保证对象可见性和有序性的关键字。其通过汇编指令添加VCC_VOLATILE关键字,让JMM层对对象的操作添加LOCK和内存屏障指令完成。
3、final关键字的内存屏障,主要体现在final修饰的元素只能在类对象初始化内部完成,不能因为指令重排序让元素初始化发生在对象初始化之外。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值