简单总结SynchronousQueue 的特点:
1. queue有三种类型: 空类型,take以及put类型,
2. 队列是某种类型时,同类型操作: 分两种: 1.阻塞method会阻塞,加入阻塞队列中 2.非阻塞method操作失败 。非同类型: 不管阻塞不阻塞method都成功。
1. 里面没有任何数据.调用offer()无法成功,返回flase,表示填充失败.不会被阻塞。
2. 先take,被阻塞,直到有一个线程来offer. 两个不同的互补碰撞发生匹配完成(fullfill). 之前的take的线程被唤醒获得offer的提供的数据。
再来解析SynchronousQueue 源代码,
SynchronousQueue 源代码注释中关键术语解析:
Node类型: 一共分层两种. 一种是 isDate=true. (对应offer , put 函数) 一种是isDate=false (对应 take函数)
dual queue:dual的含义就好理解了,因为只有两类,可以当isDate=true和isDate=false遇到时会匹配.可翻译为成双的,对偶的. 对偶队列.
same mode: 相同的模式(isDate都=true,或者isDate都=false).比如take产生的Node和前面已经放入到队列中的take动作Node就属于同一个模式
complementary :互补的.比如先take,放到队列中.后面来一个offer动作就是complementary (互补).反之亦然.
fulfill: 字面英文翻译,完成.具体到算法里的含义是一个动作和之前的complementary(译为互补)的动作得到匹配.
LinkedBlockingQueue 先put,再take 和 SynchronousQueue 先put,再take有何区别? 前者可以先放在数据队列上.后者没有地方来接受他的数据,必须等待到有一个take线程产生的数据节点来接受数据.
1. queue有三种类型: 空类型,take以及put类型,
分别说明:
1.空类型时, take和put都会被阻塞, 非阻塞offer和poll都不会阻塞. 无法成功操作。2. 队列是某种类型时,同类型操作: 分两种: 1.阻塞method会阻塞,加入阻塞队列中 2.非阻塞method操作失败 。非同类型: 不管阻塞不阻塞method都成功。
具体说来:
1.队列是take类型时:同类型操作:阻塞take操作会阻塞,非阻塞 poll()失败,非同类型: 异类的put和offer能够成功。2. 队列是put类型:同类型操作:阻塞put操作会被阻塞,非阻塞offer操作失败。非同类型: 异类的take,poll会成功
关于队列长度,界:
一个线程阻塞队列要么全是take线程,要么全是put线程. 后来的互补的操作将会匹配对头的线程.使退出队列.1. 里面没有任何数据.调用offer()无法成功,返回flase,表示填充失败.不会被阻塞。
2. 先take,被阻塞,直到有一个线程来offer. 两个不同的互补碰撞发生匹配完成(fullfill). 之前的take的线程被唤醒获得offer的提供的数据。
再来解析SynchronousQueue 源代码,
SynchronousQueue 源代码注释中关键术语解析:
Node类型: 一共分层两种. 一种是 isDate=true. (对应offer , put 函数) 一种是isDate=false (对应 take函数)
dual queue:dual的含义就好理解了,因为只有两类,可以当isDate=true和isDate=false遇到时会匹配.可翻译为成双的,对偶的. 对偶队列.
same mode: 相同的模式(isDate都=true,或者isDate都=false).比如take产生的Node和前面已经放入到队列中的take动作Node就属于同一个模式
complementary :互补的.比如先take,放到队列中.后面来一个offer动作就是complementary (互补).反之亦然.
fulfill: 字面英文翻译,完成.具体到算法里的含义是一个动作和之前的complementary(译为互补)的动作得到匹配.
LinkedBlockingQueue 先put,再take 和 SynchronousQueue 先put,再take有何区别? 前者可以先放在数据队列上.后者没有地方来接受他的数据,必须等待到有一个take线程产生的数据节点来接受数据.