【Java并发编程】

您所在的位置:网站首页 重庆渝北回收烟酒 【Java并发编程】

【Java并发编程】

2023-03-28 15:03| 来源: 网络整理| 查看: 265

概述

常规new Thread创建线程问题:

Thread线程属于一个重量级的对象,通过new Thread创建一个线程,首先它是一个Java对象,需要分配堆空间资源;同时Thread需要调用操作系统内核API,在系统层面创建一个线程与此对应,操作系统还要为线程分配一系列资源。所以,创建线程的成本是很高的,应该避免频繁创建和销毁线程。另外,线程缺乏统一管理,可能无限制新建线程,相互之间竞争加剧,以及可能占用过多系统资源导致服务器宕机或OOM等。

如何去解决这个问题,就是采用经常使用到的资源池方案,比如数据库连接池等,将资源提前初始化后放入到池中进行管理,待需要使用时从池中获取一个空闲资源,使用完后再将资源放回到池中达到释放目的,这样其它任务就可以继续重复使用该资源,避免资源被不停创建、销毁。

由于Thread API在接口设计上的问题,线程池和一般的资源池在使用上是有些差异的,比如连接池:从连接池获取可用连接 --> 使用连接执行任务 --> 将连接放入到连接池。如果我们从线程池中获取到一个Thread对象,根本没法处理我们的任务,因为Thread线程在启动之前要么重写run()、要么传入Runnable方式将任务和Thread绑定在一起。所以,Java线程池是没有提供申请线程和释放线程的方法,而是采用一种生产者/消费者模式去构建线程池执行机制。

Java线程Thread是被一对一映射到本地操作系统线程,即Java启动时会创建一个本地操作系统线程,当Java线程终止时,对应操作系统线程会被回收。

Executor体系

Java 5之前,仅仅只能使用Thread、Runnable、ThreadLocal、synchronized等进行多线程开发,线程的使用及其简陋;Java 5极大的改善并发编程,构建出了多线程开发API的基础体系,这些类主要位于java.util.concurrent包下,简称J.U.C。

Executor就是J.U.C中比较重要的一块,用于构建多线程开发中使用最普遍的线程池:

Executor【接口】:最顶层接口,该接口只定义了一个方法:void execute(Runnable command)ExecutorService【接口】:真正的线程池接口,继承Executor接口,拓展了Callable、Future、关闭方法ScheduledExecutorService【接口】:继承了ExecutorService,增加了定时任务相关的方法ThreadPoolExecutor【实现类】:ExecutorService的默认实现ScheduledThreadPoolExecutor【实现类】:继承了ThreadPoolExecutor,并实现了ScheduledExecutorService接口中相关定时任务的方法,可以认为ScheduledThreadPoolExecutor是最丰富的实现类ExecutorService

方法描述:

shutdown():优雅关闭线程池,之前提交的任务将被执行,包括当前正在执行的和等待队列中的任务,但是线程池不会再接收新任务,提交新任务会抛出异常shutdownNow():调用shutdownNow方法后, 线程池就不会再接受新的任务了,并且会丢弃工作队列里面的任务,正在执行的任务会被中断, 该方法会立刻返回,返回值为这时候队列里面被丢弃的任务列表。isShutdown():如果此线程池关闭,则返回trueisTerminated():如果关闭后所有任务都已完成,则返回trueawaitTermination():当线程调用awaitTermination方法后,当前线程会被阻塞,直到线程池状态变为TERMINATED才返回, 或者等待时间超时才返回、或当前线程被中断submit()系列方法:public Future submit(Runnable task):提交Runnable任务到线程池,注意:Runnable任务是没有返回值的,但是这里submit方法会返回一个Future对象,调用Future.get()方法会阻塞,直到Runnable任务执行完成,Future.get()方法 才会返回nullpublic Future submit(Runnable task, T result):和submit(Runnable task)一样,只是可以指定一个默认返回值,待Runnable任务结束后,Future.get()就可以获取到该返回值public Future submit(Callable task):提交一个Callable任务,该任务是带有返回结果的invokeAll()系列方法:invokeAll(Collection


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3