线程花絮

多线程文章目录

---简单对相关知识做的摘抄和收集--

进程(Process)与线程(Thread)

  • 进程是系统资源分配的最小单元。线程是CPU调度的最小单元。
  • 一个 进程至少包含一个线程,可以包含多个线程。这些线程共享这个进程的资源。
  • 每个线程都拥有独立的运行栈和程序计数器,线程切换开销小。
  • 多进程指的是操作系统同时运行多个程序,如当前操作系统中同时运行着QQ、IE、微信等程序。
  • 多线程指的是同一进程中同时运行多个线程,如迅雷运行时,可以开启多个线程,同时进行多个文件的下载。

并行(Parallel)、并发(Concurrent)与多线程(Multithreading)

  • 并行是指多个任务在同一时刻进行。并发是指多个任务在同一时间段内发生。
  • 并行是物理上的同时发生,而并发是逻辑上的同时发生。
  • 体现在程序上: 并行是指多个CPU内核在同一时刻,同时运行多个任务。并发是指单个CPU内,通过CPU调度算法,让用户感觉在同时运行多个任务。
  • 更形象的说法: 并行是指两队人员同时使用两台咖啡机。并发是指两队人员交替使用同一台咖啡机。—-Erlang 之父 Joe Armstrong。
  • 多线程即多个线程,一般只多个同时在运行的单线程。
  • 如果是在单核CPU上,多线程肯定是并发运行的。如果是在多核CPU上,这些多线程也可能是并行运行。
众所周知,JDK5是Java发展的一个重要版本,提供了很多技术,如泛型 Generic、枚举类型 Enumeration、可变参数varargs、注解 Annotations等等。

在JDK1.5版本中,也提供了对并发编程极为重要的一个包:java.util.concurrent(并发包)

java.util.concurrent(并发包)提供了一些列较为给力的并发技术,主要有:

原子(Atomic)类型:如AtomicInteger、AtomicReference等,保证变量的原子性和可见性。
显式锁(Lock)接口:对之前版本锁机制的重构,相较于synchronized 关键字,能够提供更加灵活的特性,如:能够指定锁定公平性、可以实现分组唤醒(Condition)、性能更好的锁。主要包括:Lock接口、ReadWriteLock接口和Condition接口。
计数器(CountDownLatch):利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行。
回环栅栏(CyclicBarrier):通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。
信号量(Semaphore):Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
并发集合:即集合类在并发环境下的版本。主要有:BlockingQueue(Queue)、ConcurrentMap(Map)、ConcurrentHashMap(HashMap)、CopyOnWriteArrayList(ArrayList)。
Callable和Future接口:为了解决继承Thread类和实现Runnable接口存在的弊端(不允许声明检查型异常,不能定义返回值),而引入的线程的新的定义方式。
执行器(Executor接口):Executors相关类隐藏了如何处理Runnable的细节,提供了一组方法,能够创建拥有完善配置的线程池和executor。
关于原子(Atomic)类型、显式锁(Lock)接口、并发集合、Callable和Future接口、执行器(Executor接口)的更多内容,计划在后续章节中进行更加详细的学习。

3.JDK7
在JDK1.7版本中,主要提供的并发编程技术有:

TransferQueue:比BlockingQueue性能更好的并发集合实现。
分支合并(Fork/Join)框架:运用分治法(divide-and-conquer)的思想,实现线程池中任务的自动调度,并且这种调度对用户来说是透明的,典型应用ForkJoinPool。
关于分支合并(Fork/Join)框架的更多内容,计划在后续章节中进行更加详细的学习。

4.JDK8
在JDK.18版本中,主要提供的并发编程技术有:

加法器(Adder)和累加器(Accumulator):原子类型的扩充与优化,主要有:LongAdder、LongAccumulator、DoubleAdder和DoubleAccumulator,比AtomicLong和AtomicDouble性能更优。
CompletableFuture:JDK5中Future的增强版。
StampedLock:JDK5中ReadWriteLock的改进版。

java.utils.concurrent

atomic包:提供了原子操作的基本类型还有数组等

原理:volatile关键字,naive的cas算法来实现

lock包: 锁lock、ReentrantLock、ReentrantReadWriteLock中的ReadLock、WriteLock

其他:包含了

1、多线程相关 线程、多线程、线程池、有返回结果的线程、forkjoin

扫描二维码关注公众号,回复: 11185242 查看本文章

Executor ThreadPoolExecutor 线程池设置类 Executors 四种线程池(ScheduledExecutorService

ExecutorService 线程池管理者

Runnable,Callable,Future,FutureTask

Executor就是Runnable和Callable的调度容器,Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果、设置结果操作。get方法会阻塞,直到任务返回结果(Future简介)

FutureTask则是一个RunnableFuture,而RunnableFuture实现了Runnbale又实现了Futrue这两个接口由于FutureTask实现了Runnable,因此它既可以通过Thread包装来直接执行,也可以提交给ExecuteService来执行。并且还可以直接通过get()函数获取执行结果,该函数会阻塞,直到结果返回。因此FutureTask既是Future、Runnable,又是包装了Callable( 如果是Runnable最终也会被转换为Callable ), 它是这两者的合体。

2、并发集合、ConcurrentHashMap等

3、并发队列:有界队列、无届队列、阻塞队列

4.四种多线程的小工具,信号量、屏障、循环屏障

CountDownLatch  协调多个线程的执行顺序,等待条件一起执行

CyclicBarrier 栅栏,指定数量的线程到达指定位置一起执行

Exchanger 双数的线程在某个点交换数据

https://blog.csdn.net/carson0408/article/details/79477280

Semaphore  得到信号量的可以执行,执行完返还信号量 

原创文章 74 获赞 57 访问量 17万+

猜你喜欢

转载自blog.csdn.net/Zzhou1990/article/details/106007630
今日推荐