多线程中级(一)并发工具类

一、概述

前两节主要关注的是java对底层线程操作的支持。这章开始关注Java对高级线程操作的支持,即并发工具类。你可以认为使用并发工具类和使用高级语言编写应用程序类似,而使用较底层的线程操作和使用汇编语言编写应用程序类似。

并发工具类可以被分为executor、同步器(synchronize)以及锁框架等。

二、Executor

一个executor就是这样一种对象,它的类直接或间接地实现了java.util.concurrent.Executor接口,这样便从任务执行机制中解耦任务的提交操作。

Executor声明了一个单独的void execute(Runnable runable)方法,该方法会在将来的某个时间点执行这个名为runnable的运行任务。当runnable是Null时,execute()方法会抛出空指针异常。当无法执行runnable时,会抛出RejectedExecutionException

注意:当一个executor正在关闭并且不想接受新的任务时,RejectedExecutionException会被抛出;当executor没有足够的空间储存这一任务(或许executor使用有限的阻塞队列来存储任务并且队列已满)时,这种异常会被抛出。

例子:

new Thread(new RunnableTask()).start();

等价于

Executor executor=...;//...represents some executor creation

executor.execute(new RunnableTask());

从而引出线程池ExecutorService接口

ExecutorService接口扩展了Executor接口并且实现了一个典型的线程池

future接口

future接口,它代表着一种异步运算的结果。这个结果之所以被称为Future,是因为它通常要到未来的某个时刻才有效。Future的泛型是Future<V>,它提供了取消任务、返回任务的结果以及判断任务是否已经结束的方法。

future有几个方法,cancel,get,isCancelled,isDone,方法的含义如英文名,其中get是用来接收线程工作返回的结果,有返回值,那么线程实现的一定不是Runnable接口,而是Callable接口,两种接口的区别就是Callable有返回值,并且可以抛出异常。

executor.submit()会返回一个future对象的引用,这个引用控制任务的执行以及结果访问。此线程最终会调用该对象的get()方法获取结果

ThreadPoolExecutor

ThreadPoolExecutor执行execute方法分为以下4中情况:

如果当前运行的线程小于corePoolSize,则创建线程来执行任务(注意:执行这一步需要获取去全局锁)。

如果运行的线程等于或者多于corePoolSize,则将任务加入到BlockingQueue。

如果无法将任务加入到BlockingQueue(队列已满),则创建新的线程来处理任务(注意执行这一步骤需要获取全局锁)。

如果创建新线程将使当前运行的线程超出maximumPoolSize,则任务将被拒绝,并调用RejectedExecutionHandler.rejectedExecution()方法。

ThreadPoolExecutor采取上述步骤的总体设计思路,是为了在执行execute()方法时,尽可能地避免获取全局锁(那将会是一个严重的可伸缩瓶颈)。在ThreadPoolExecutor完成预热之后(当前运行的线程数大于等于corePoolSize),几乎所有的execute方法调用都是执行步骤二,而步骤二不需要获取全局锁。

未完待续

额,看别的博文,记录下要点

【注意】 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
--------------------- 
作者:whuslei 
来源:CSDN 
原文:https://blog.csdn.net/whuslei/article/details/6667471/ 
版权声明:本文为博主原创文章,转载请附上博文链接!

为什么父类的引用能指向子类对象呢?

父类定义了子类中一定存在的方法和属性。

同理,接口的引用指向他的实例化对象也是因为实例化对象中必然要实现 接口中定义的方法和属性。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值