首页 > 编程知识 正文

java线程池异步调用方法,java异步方式

时间:2023-05-05 13:40:16 阅读:109026 作者:3678

1 .简单了解什么是异步调用异步调用,就是打开另一个线程异步执行,而不阻塞主线程

main{//前置语句costTime (; //后置语句}在上面的代码中,主线程必须按顺序执行前缀,并调用costTime函数。 此函数既费时间,又是后置语句。 执行costtime函数时,主线程为阻塞状态。 如果后置语句和costTime函数的执行没有直接关联,他们可以一起执行。 这种执行方式是对costTime的异步调用,此时主线程是非阻塞状态

2 .简单实现异步调用的最简单方法是在new Thread中,抛出costTime

main{//前置语句newthread(newrunnable () ) {@Overridepublic void run ) {costTime; () ) .开始; //后置语句}这种实现方式的缺点是:

每次执行都需要new Thread,性能差的线程不容易管理,可能会无限地创建新线程,消耗过多的系统资源,无法定时执行等,OOM功能不完整

为了解决以上问题,可以使用的线程池3 .线程池是指事先制作多个线程。 如果任务需要处理,线程池中的线程将处理该任务,并且处理完成后不会销毁该线程,而是等待下一个任务。 由于创建和销毁线程会占用系统资源,因此如果mydjm希望经常创建和销毁线程,请考虑使用线程池来提高系统性能。

Java通过Executors提供了以下常见线程池:

newFixedThreadPool,创建固定长度线程池以控制最大并发线程数,超出的线程在队列中等待。 executorservicefixedthreadpool=executors.newfixedthreadpool (3; fixed thread pool.execute (new runnable ) { @Override public void run ) )/dosomething ); newCachedThreadPool最初线程池为空,如果有任务来了,就直接执行,否则启动新线程。 最大线程数的控制由计算机内存决定,如果一个线程的空闲时间缺省超过60秒,则丢弃线程executorservicecachedthreadpool=executoreadpool newSingleThreadExecutor,创建单线程化线程池,并仅通过唯一的工作线程执行任务。 确保所有任务按指定顺序运行executorservicesinglethreadexecutor=executors.newsinglethreadexecutor.executor newScheduledThreadPool负责执行计划和定期任务//创建支持在延迟1秒内运行scheduledexecutorservicescheduledthreadpool=executors.newscheduledthreadpool的定长线程池@Override public void run ) )//dosomething ),1, TimeUnit.SECONDS //1延迟1秒后每秒钟scheduled thread pool.scheduleatfixedrate (new runnable ) ) { @Override public void run ) } 每个线程维护一个等待任务队列,一个线程空闲后,窃取任务到其他线程的等待队列中完成。 executorserviceservice=executors.neworkstealvice.neworksteallvice剥夺service.execute(newrunnable () { @ override puble 这种方式也有一定的风险。 例如

newFixedThreadPool和newSingleThreadExecutor:的主要问题是,堆栈的请求处理队列可能占用非常大的内存或OOM。 newCachedThreadPool和newScheduledThreadPool:的主要问题是,最大线程数为Integer.MAX_VALUE,可能会创建非常多的线程,OOM为thread pool

4.ThreadPoolExecutor参数说明:

publicthreadpoolexecutor (intcorepoolsize,//核心线程数int maximumPoolSize,//最大线程数long keepAliveTime,//线程最大生存时间time ununulse //小时BlockingQueueRunnable workQueue,//任务队列ThreadFactory threadFactory,//线程工厂rejectedexecutionhandler(/线程数

executorservicepool=newthreadpoolexecutor (5,200,0l,TimeUnit.MILLISECONDS,newLinkedBlockingqueue(1024 ),nameded pool.shutdown (; //gracefully shutdown

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。