并发编程J.U.C


一. Java的线程并发库介绍
在 Java 5.0 提供了 java.util.concurrent(简称JUC)包。 
并发编程网站:http://ifeve.com/tag/juc/
整体框架:
Java多线程和J.U.C并发编程(二)


二. Executor框架(线程池、 Callable 、Future)
1. Executor框架介绍
线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等。线程用于执行异步任务,单个的线程既是工作单元也是执行机制,从JDK1.5开始,为了把工作单元与执行机制分离开,Executor框架诞生了,它是一个用于统一创建与运行的接口。Executor框架实现的就是线程池的功能。
1.1. Executor框架图:

Java多线程和J.U.C并发编程(二)
①Executor:一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable command);
② ExecutorService:是一个比Executor使用更广泛的子类接口,其提供了生命周期管理的方法,以及可跟踪一个或多个异步任务执行状况返回Future的方法;
③ AbstractExecutorService:ExecutorService执行方法的默认实现;
④ ScheduledExecutorService:一个可定时调度任务的接口;
⑤ ScheduledThreadPoolExecutor:ScheduledExecutorService的实现,一个可定时调度任务的线程池;
⑥ ThreadPoolExecutor:线程池,可以通过调用Executors以下静态工厂方法来创建线程池并返回一个ExecutorService对象。
1.2. Executor框架包括3大部分
(1)任务:也就是工作单元,包括被执行任务需要实现的接口(Runnable接口或者Callable接口);
(2)任务的执行:也就是把任务分派给多个线程的执行机制,包括Executor接口及继承自Executor接口的ExecutorService接口;
(3)异步计算的结果:包括Future接口及实现了Future接口的FutureTask类。


2. Executor框架的使用示意图
Java多线程和J.U.C并发编程(二)
主线程创建实现Runnable或者Callable接口的任务对象,工具类Executors可以把一个Runnable对象封装成一个Callable对象,使用Executors.callable(Runnable task)。然后交给ExecutorService用execute或者submit执行,前者不返回结果,后者可以返回实现了Future接口的对象(到目前为止返回的是FutureTask对象),FutureTask实现了Runnable,程序员可以创建FutureTask,然后直接交给ExecutorService。
最后主线程可以执行FutureTask.get()方法等待任务完成(阻塞方法),也可以使用FutureTask.cancell(boolean mayInterruptIfRunning) 来取消任务的执行。


3. Executors工具类创建各种线程池(常见四类)
Java5中并发库中,线程池创建线程大致可以分为下面四种:

//创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
ExecutorService service = Executors.newFixedThreadPool(3);

//创建一个定长线程池,支持定时及周期性任务执行
ExecutorService service = Executors.newScheduledThreadPool(3);

//创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。(线程最大并发数不可控制)
ExecutorService service = Executors.newCachedThreadPool();

//创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
ExecutorService service = Executors.newSingleThreadExecutor();

4. ExecutorService执行器
java.util.concurrent.ExecutorService 接口表示一个异步执行机制,使我们能够在后台执行任务。因此一个 ExecutorService 很类似于一个线程池。实际上,存在于 java.util.concurrent 包里的 ExecutorService 实现就是一个线程池实现。
4.1. ExecutorService实现类(创建线程池)
既然ExecutorService 是个接口,如果你想用它的话就得去使用它的实现类之一。
java.util.concurrent 包提供了 ExecutorService 接口的以下实现类:

ThreadPoolExecutor;
ScheduledThreadPoolExecutor;

备注:ScheduledExecutorService 是一个接口,你要用它的话就得使用 java.util.concurrent 包里对它的某个实现类(ScheduledThreadPoolExecutor)。ScheduledExecutorService 的使用方法一旦你创建了一个 ScheduledExecutorService,你可以通过调用它的以下方法:

schedule (Callable task, long delay, TimeUnit timeunit);

schedule (Runnable task, long delay, TimeUnit timeunit);

scheduleAtFixedRate (Runnable, long initialDelay, long period, TimeUnit timeunit);

scheduleWithFixedDelay (Runnable, long initialDelay, long period, TimeUnit timeunit);

4.2. ExecutorService使用方法(执行线程池)
有几种不同的方式来将任务委托给ExecutorService 去执行:
① execute(Runnable) 方法要求一个 java.lang.Runnable 对象,然后对它进行异步执行。
② submit(Runnable) 方法也要求一个 Runnable 实现类,但它返回一个 Future 对象。这个 Future 对象可以用来检查 Runnable 是否已经执行完毕。
③ submit(Callable) 方法类似于 submit(Runnable) 方法,除了它所要求的参数类型之外。Callable 实例除了它的 call() 方法能够返回一个结果之外,其它和一个 Runnable 很相像。Runnable.run() 不能够返回一个结果。Callable 的结果可以通过 submit(Callable) 方法返回的 Future 对象进行获取。
④ invokeAny() 接收一个包含 Callable 对象的集合作为参数。调用该方法不会返回 Future 对象,而是返回集合中某一个 Callable 对象的结果,而且无法保证调用之后返回的结果是哪一个Callable,只知道它是这些 Callable 中一个执行结束的 Callable 对象。如果一个任务运行完毕或者抛出异常,方法会取消其它的 Callable 的执行。
⑤invokeAll() 方法将调用你在集合中传给 ExecutorService 的所有 Callable 对象。invokeAll() 返回一系列的 Future 对象,通过它们你可以获取每个 Callable 的执行结果。记住,一个任务可能会由于一个异常而结束,因此它可能没有"成功"。无法通过一个 Future 对象来告知我们是两种结束中的哪一种。
4.3.  ExecutorService关闭(关闭线程池)
使用shutdown和shutdownNow可以关闭线程池。
两者的区别:shutdown只是将线程池的状态设置为SHUTWDOWN状态,正在执行的任务会继续执行下去,没有被执行的则中断。而shutdownNow则是将线程池的状态设置为STOP,正在执行的任务则被停止,没被执行任务的则返回。


三. AbstractQueuedSynchronizer (AQS框架)

 



四. Locks & Condition(锁和条件变量)



五. Synchronizers(同步器)



六. Atomic Variables(原子变量)



七. BlockingQueue(阻塞队列)



八. Concurrent Collections(并发容器)



九. Fork/Join并行计算框架



十. TimeUnit枚举
 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • 2021-12-20
  • 2021-08-18
  • 2021-08-29
  • 2021-10-18
  • 2021-08-07
  • 2022-02-16
  • 2021-10-19
  • 2021-04-28
猜你喜欢
  • 2021-11-22
  • 2021-12-01
  • 2021-04-21
  • 2021-06-02
  • 2022-12-23
  • 2021-12-12
  • 2021-08-25
相关资源
相似解决方案