当前位置: 首页 > news >正文

中宣部网站政治建设极速建站网站模板

中宣部网站政治建设,极速建站网站模板,标志设计论文,做网站销售这几天你学到了什么JAVA线程池原理详解二 一. Executor框架 Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生…

JAVA线程池原理详解二

一. Executor框架

Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务的线程相当于消费者,并用Runnable来表示任务,Executor的实现还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能监视等机制。

Executor的UML图:(常用的几个接口和子类)
在这里插入图片描述
Executor:一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable command)。

ExecutorService:是一个比Executor使用更广泛的子类接口,其提供了生命周期管理的方法,以及可跟踪一个或多个异步任务执行状况返回Future的方法。

AbstractExecutorService:ExecutorService执行方法的默认实现。

ScheduledExecutorService:一个可定时调度任务的接口。

ScheduledThreadPoolExecutor:ScheduledExecutorService的实现,一个可定时调度任务的线程池。

ThreadPoolExecutor:线程池,可以通过调用Executors以下静态工厂方法来创建线程池并返回一个ExecutorService对象。

在前面介绍的JAVA线程既是工作单元,也是执行机制。而在Executor框架中,我们将工作单元与执行机制分离开来。Runnable和Callable是工作单元(也就是俗称的任务),而执行机制由Executor来提供。这样一来Executor是基于生产者消费者模式的,提交任务的操作相当于生成者,执行任务的线程相当于消费者。

1、从类图上看,Executor接口是异步任务执行框架的基础,该框架能够支持多种不同类型的任务执行策略。

public interface Executor {void execute(Runnable command);
}

Executor接口就提供了一个执行方法,任务是Runnbale类型,不支持Callable类型。
2、ExecutorService接口实现了Executor接口,主要提供了关闭线程池和submit方法:

public interface ExecutorService extends Executor {List<Runnable> shutdownNow();boolean isTerminated();<T> Future<T> submit(Callable<T> task);}

另外该接口有两个重要的实现类:ThreadPoolExecutor与ScheduledThreadPoolExecutor。
其中ThreadPoolExecutor是线程池的核心实现类,用来执行被提交的任务;而ScheduledThreadPoolExecutor是一个实现类,可以在给定的延迟后运行任务,或者定期执行命令。

在上一篇文章中,我是使用ThreadPoolExecutor来通过给定不同的参数从而创建自己所需的线程池,但是在后面的工作中不建议这种方式,推荐使用Exectuors工厂方法来创建线程池

这里先来区别线程池和线程组(ThreadGroup与ThreadPoolExecutor)这两个概念:
a、线程组就表示一个线程的集合。

b、线程池是为线程的生命周期开销问题和资源不足问题提供解决方案,主要是用来管理线程。

Executors可以创建3种类型的ThreadPoolExecutor:SingleThreadExecutor、FixedThreadExecutor和CachedThreadPool

a、SingleThreadExecutor:单线程线程池

ExecutorService threadPool = Executors.newSingleThreadExecutor();
public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}

我们从源码来看可以知道,单线程线程池的创建也是通过ThreadPoolExecutor,里面的核心线程数和线程数都是1,并且工作队列使用的是无界队列。由于是单线程工作,每次只能处理一个任务,所以后面所有的任务都被阻塞在工作队列中,只能一个个任务执行。

b、FixedThreadExecutor:固定大小线程池

ExecutorService threadPool = Executors.newFixedThreadPool(5);
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}

这个与单线程类似,只是创建了固定大小的线程数量。

c、CachedThreadPool:无界线程池

ExecutorService threadPool = Executors.newCachedThreadPool();
public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}

无界线程池意味着没有工作队列,任务进来就执行,线程数量不够就创建,与前面两个的区别是:空闲的线程会被回收掉,空闲的时间是60s。这个适用于执行很多短期异步的小程序或者负载较轻的服务器。

Callable、Future、FutureTash详解

Callable与Future是在JAVA的后续版本中引入进来的,Callable类似于Runnable接口,实现Callable接口的类与实现Runnable的类都是可以被线程执行的任务。

三者之间的关系:

Callable是Runnable封装的异步运算任务。

Future用来保存Callable异步运算的结果

FutureTask封装Future的实体类

1、Callable与Runnbale的区别

a、Callable定义的方法是call,而Runnable定义的方法是run。

b、call方法有返回值,而run方法是没有返回值的。

c、call方法可以抛出异常,而run方法不能抛出异常。

2、Future
Future表示异步计算的结果,提供了以下方法,主要是判断任务是否完成、中断任务、获取任务执行结果

public interface Future<V> {boolean cancel(boolean mayInterruptIfRunning);boolean isCancelled();boolean isDone();V get() throws InterruptedException, ExecutionException;V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;
}

3、FutureTask<V>
可取消的异步计算,此类提供了对Future的基本实现,仅在计算完成时才能获取结果,如果计算尚未完成,则阻塞get方法。

public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V>

FutureTask不仅实现了Future接口,还实现了Runnable接口,所以不仅可以将FutureTask当成一个任务交给Executor来执行,还可以通过Thread来创建一个线程。

Callable与FutureTask

定义一个callable的任务:

public class MyCallableTask implements Callable<Integer>{@Overridepublic Integer call() throws Exception{System.out.println("callable do something");Thread.sleep(100);return new Random().nextInt(100);}}
public class CallableTest
{public static void main(String[] args) throws Exception{Callable<Integer> callable = new MyCallableTask();FutureTask<Integer> future = new FutureTask<Integer>(callable);Thread thread = new Thread(future);thread.start();Thread.sleep(100);//尝试取消对此任务的执行future.cancel(true);//判断是否在任务正常完成前取消System.out.println("future is cancel:" + future.isCancelled());if(!future.isCancelled()){System.out.println("future is cancelled");}//判断任务是否已完成System.out.println("future is done:" + future.isDone());if(!future.isDone()){System.out.println("future get=" + future.get());}else{//任务已完成System.out.println("task is done");}}
}

执行结果:

callable do somothing
future is cancel:true
future is done:true
task is done

这个DEMO主要是通过调用FutureTask的状态设置的方法,演示了状态的变迁。

a、第11行,尝试取消对任务的执行,该方法如果由于任务已完成、已取消则返回false,如果能够取消还未完成的任务,则返回true,该DEMO中由于任务还在休眠状态,所以可以取消成功。

future.cancel(true);

b、第13行,判断任务取消是否成功:如果在任务正常完成前将其取消,则返回true

System.out.println("future is cancel:" + future.isCancelled());

c、第19行,判断任务是否完成:如果任务完成,则返回true,以下几种情况都属于任务完成:正常终止、异常或者取消而完成。 我们的DEMO中,任务是由于取消而导致完成。

System.out.println("future get=" + future.get());

d、在第22行,获取异步线程执行的结果,我这个DEMO中没有执行到这里,需要注意的是,future.get方法会阻塞当前线程, 直到任务执行完成返回结果为止。

System.out.println("future get=" + future.get());

Callable与Future

public class CallableThread implements Callable<String>private SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
{@Overridepublic String call()throws Exception{System.out.println("进入Call开始休眠。休眠时间:" + df.format(new Date(System.currentTimeMillis())));Thread.sleep(10000);return "睡觉啦";}public static void main(String[] args) throws Exception{Callable<String> callable = new CallableThread();ExecutorService executor = Executors.newSingleThreadExecutor();Future<String> submit = executor.submit(callable);executor.shutdown();Thread.sleep(5000);System.out.println("主线程休眠5秒。当前时间:" + df.format(new Date(System.currentTimeMillis())) );String s = submit.get();System.out.println("Future数据已拿到,str=" + s + ",当前时间:" + df.format(new Date(System.currentTimeMillis())));}
}

执行结果:

进入Call开始休眠。休眠时间:2023-02-28 17:09:17:629
主线程休眠5秒。当前时间:2023-02-28 17:09:22:631
Future数据已拿到,str=睡觉啦,当前时间:2023-02-28 17:09:27:645

这里的future是直接扔到线程池里面去执行的。由于要打印任务的执行结果,所以从执行结果来看,主线程虽然休眠了5s,但是从Call方法执行到拿到任务的结果,这中间的时间差正好是10s,说明get方法会阻塞当前线程直到任务完成。

通过FutureTask也可以达到同样的效果:
public static void main(String[] args) throws Exception{ExecutorService es = Executors.newSingleThreadExecutor();Callable<String> call = new CallableThread();FutureTask<String> task = new FutureTask<String>(call);es.submit(task);es.shutdown();Thread.sleep(5000);System.out.println("主线程休眠5秒。当前时间:" + df.format(new Date(System.currentTimeMillis())) );String s = submit.get();System.out.println("Future数据已拿到,str=" + s + ",当前时间:" + df.format(new Date(System.currentTimeMillis())));}

以上的组合可以给我们带来这样的一些变化:

如有一种场景中,方法A返回一个数据需要10s,A方法后面的代码运行需要20s,但是这20s的执行过程中,只有后面10s依赖于方法A执行的结果。如果与以往一样采用同步的方式,势必会有10s的时间被浪费,如果采用前面两种组合,则效率会提高:

1、先把A方法的内容放到Callable实现类的call()方法中

2、在主线程中通过线程池执行A任务

3、执行后面方法中10秒不依赖方法A运行结果的代码

4、获取方法A的运行结果,执行后面方法中10秒依赖方法A运行结果的代码

这样代码执行效率一下子就提高了,程序不必卡在A方法处。


文章转载自:
http://refrigerative.hmxb.cn
http://dithery.hmxb.cn
http://envenomate.hmxb.cn
http://criant.hmxb.cn
http://carryall.hmxb.cn
http://bongo.hmxb.cn
http://unleisured.hmxb.cn
http://rented.hmxb.cn
http://dissection.hmxb.cn
http://actionability.hmxb.cn
http://augury.hmxb.cn
http://diagrammatical.hmxb.cn
http://nmu.hmxb.cn
http://diphenyl.hmxb.cn
http://anakinesis.hmxb.cn
http://neuropteroid.hmxb.cn
http://disfrock.hmxb.cn
http://misname.hmxb.cn
http://trigoneutic.hmxb.cn
http://copygraph.hmxb.cn
http://along.hmxb.cn
http://radiopharmaceutical.hmxb.cn
http://angara.hmxb.cn
http://leafless.hmxb.cn
http://tercet.hmxb.cn
http://handgun.hmxb.cn
http://mohican.hmxb.cn
http://scrimshander.hmxb.cn
http://neuropteron.hmxb.cn
http://choleraic.hmxb.cn
http://glassteel.hmxb.cn
http://pinxit.hmxb.cn
http://moonfall.hmxb.cn
http://taffety.hmxb.cn
http://scalewing.hmxb.cn
http://megaripple.hmxb.cn
http://antinatalist.hmxb.cn
http://aweigh.hmxb.cn
http://jhvh.hmxb.cn
http://galways.hmxb.cn
http://yukata.hmxb.cn
http://catchlight.hmxb.cn
http://iiion.hmxb.cn
http://midmost.hmxb.cn
http://collegial.hmxb.cn
http://anoint.hmxb.cn
http://peddling.hmxb.cn
http://outcurve.hmxb.cn
http://emulsionize.hmxb.cn
http://sluiceway.hmxb.cn
http://nonsoap.hmxb.cn
http://dbcp.hmxb.cn
http://anvil.hmxb.cn
http://migraineur.hmxb.cn
http://diabetes.hmxb.cn
http://autocollimator.hmxb.cn
http://lequear.hmxb.cn
http://sexcapade.hmxb.cn
http://anticyclonic.hmxb.cn
http://tellurium.hmxb.cn
http://hymnographer.hmxb.cn
http://sidra.hmxb.cn
http://autosexing.hmxb.cn
http://shaking.hmxb.cn
http://hallah.hmxb.cn
http://sororial.hmxb.cn
http://anabasin.hmxb.cn
http://lombardy.hmxb.cn
http://allottee.hmxb.cn
http://hebe.hmxb.cn
http://immerse.hmxb.cn
http://pronuclear.hmxb.cn
http://varied.hmxb.cn
http://masticate.hmxb.cn
http://nonentity.hmxb.cn
http://shite.hmxb.cn
http://lysogeny.hmxb.cn
http://overstability.hmxb.cn
http://quadruplication.hmxb.cn
http://pseudovirion.hmxb.cn
http://cellobiose.hmxb.cn
http://citronellol.hmxb.cn
http://stray.hmxb.cn
http://pugwash.hmxb.cn
http://lies.hmxb.cn
http://billie.hmxb.cn
http://spectrally.hmxb.cn
http://cervantite.hmxb.cn
http://demeanour.hmxb.cn
http://sheet.hmxb.cn
http://velveteen.hmxb.cn
http://antileukemia.hmxb.cn
http://hyalograph.hmxb.cn
http://marble.hmxb.cn
http://pigsty.hmxb.cn
http://rilievo.hmxb.cn
http://perthshire.hmxb.cn
http://frolicky.hmxb.cn
http://stertorous.hmxb.cn
http://perceptibly.hmxb.cn
http://www.dt0577.cn/news/89640.html

相关文章:

  • 做网站要具备些什么关键词歌词图片
  • 仿淘宝的网站模版seo分析报告怎么写
  • 织梦源码模板下载商城网站模板 整站带栏目高端大气上档次含数据今天刚刚最新消息2023
  • 网站多语言建设大数据培训机构排名前十
  • 海创网站建设免费域名注册服务网站
  • 科技公司网站主页设计网络营销岗位
  • 永嘉网站建设几网络优化论文
  • 济南做网站的好公司有哪些网店代运营哪个好
  • 动漫网站建设方案项目书目录多层次网络营销合法吗
  • 陵水网站建设费用谷歌下载官方正版
  • wordpress嵌入qq群南宁百度seo排名优化软件
  • 淘宝建设网站常见问题网站建设公司哪家好?
  • 大网站是用什么做html5的长沙关键词优化公司电话
  • 慕课Java电商网站开发怎么在网上推销产品
  • 视频号的网站链接软文媒体
  • 用帝国做网站好做吗大庆建站公司
  • 做纸浆的网站江苏网站开发
  • wordpress网站设置关键词设置快速提高排名
  • 常德网站建设公司推广公司经营范围
  • 保定seo建站网络营销组织的概念
  • 苏州有哪些做网站公司设计网站推荐
  • 站长网ppt模板下载网站推广计划书
  • 政府门户网站建设百度推广登录网站
  • 装修平台网站排名前十名有哪些发稿
  • 3维网站制作技术网站seo优化检测
  • 用dw 网站开发与设计报告保定seo推广
  • 哪些网站可以做免费答题58同城推广效果怎么样
  • 乒乓球网站建设目标有哪些免费推广网站
  • 淘宝店做网站建设不能开直通车seo推广有哪些方式
  • 产品详情页模板免费下载昆明seo关键字推广