领测软件测试网
领测首页
测试技术
软件测试工具
安全测试
性能测试
测试管理
自动测试
Web测试
测试用例
单元测试
测试模版
敏捷测试
缺陷管理
移动平台测试
查看更多的软件测试技术
测试视频
《测试团队的招聘与管理
由IGT科技开发(北京)有限公司系统测试部门高级测试
《我们应该如何构建我们
一个功能从编写代码完成到上线需要多长时间?当然
软件测试沙龙视频
商业软件测试工具视频
开源软件测试工具视频
软件测试技术视频
外国专家讲软件测试
查看更多的软件测试视频
资源下载
模板
教程
环境
性能
功能
管理
测试环境下载
视频制作工具
软件测试辅助工具
软件测试资料库
商业测试工具
开源测试工具
下载更多的软件测试资源
测试沙龙
搜索
给我们投稿
投稿入口
投稿说明
加入测试专家俱乐部
华为拿下的这个5G编码到底是什么
乐视危机虚实:贾跃亭,一个梦想
半个美国网络瘫痪让中国企业负责
软件测试
>
测试开发技术
>
软件测试开发语言
>
Java
>
关于多线程同步的初步教程--Barrier的设计及使用
发表于:2007-05-25
来源:
作者:
点击数:
标签:
线程
--Barrier
初步
同步
教程
Barrier是一个多线程编程中经常要用到的同步工具,尤其多用于大数据量的计算过程中的同步。本文以广为流程的DougLea的concurrent工具包的Barrier实现为例,进行一点探讨。在DougLea的concurrent工具包中,Barrier是一个接口,在concurrent包中提供了两个Barr
Barrier是一个多线程
编程
中经常要用到的同步工具,尤其多用于大数据量的计算过程中的同步。本文以广为流程的Doug Lea的concurrent工具包的Barrier实现为例,进行一点探讨。在Doug Lea的concurrent工具包中,Barrier是一个接口,在concurrent包中提供了两个Barrier的实现:CyclicBarrier和Rendezvous。下面是Barrier接口的定义:
public
interface
Barrier {
/**
* Return the number of parties that must meet per barrier
* point. The number of parties is always at least 1.
**/
public
int
parties();
/**
* Returns true if the barrier has been compromised
* by threads leaving the barrier before a synchronization
* point (normally due to inter
rup
tion or timeout).
* Barrier methods in implementation classes throw
* throw BrokenBarrierException upon detection of breakage.
* Implementations may also support some means
* to clear this status.
**/
public
boolean
broken();
}
Barrier接口中的方法非常简单,parties()返回所有需要在屏障处同步的线程数;broken()返回一个标志,指示释放是否已被破坏。Barrier接口中并没有提供加入屏障的方法,而是在c和Rendezvous的Barrier实现中提供的。你可以会疑问,为什么不在Barrier接口中提供这些方法呢?因为这些实现的差异迥异,以至于很难在这些实现中提炼出一个共用的方法签名。比如,对于CyclicBarrier加入屏障的方法是:barrier(),
// CyclicBarrier.
java
public
int
barrier()
throws
InterruptedException
, BrokenBarrierException {
return
doBarrier(
false
, 0);
}
protected
synchronized
int
doBarrier(
boolean
timed,
long
msecs)
throws
InterruptedException
, TimeoutException, BrokenBarrierException {
int
index = --count_;
if
(broken_) {
throw
new
BrokenBarrierException(index);
}
else
if
(
Thread
.interrupted()) {
broken_ =
true
;
notifyAll();
throw
new
InterruptedException
();
}
else
if
(index == 0) {
// tripped
count_ = parties_;
++resets_;
notifyAll();
try
{
if
(barrierCommand_ !=
null
)
barrierCommand_.run();
return
0;
}
catch
(
RuntimeException
ex) {
broken_ =
true
;
return
0;
}
}
else
if
(timed && msecs <= 0) {
broken_ =
true
;
notifyAll();
throw
new
TimeoutException(msecs);
}
else
{
// wait until next reset
int
r = resets_;
long
startTime = (timed)?
System
.currentTimeMillis() : 0;
long
waitTime = msecs;
for
(;;) {
try
{
wait(waitTime);
}
catch
(
InterruptedException
ex) {
// Only claim that broken if interrupted before reset
if
(resets_ == r) {
broken_ =
true
;
notifyAll();
throw
ex;
}
else
{
Thread
.currentThread().interrupt();
// propagate
}
}
if
(broken_)
throw
new
BrokenBarrierException(index);
else
if
(r != resets_)
return
index;
else
if
(timed) {
waitTime = msecs - (
System
.currentTimeMillis() - startTime);
if
(waitTime <= 0) {
broken_ =
true
;
notifyAll();
throw
new
TimeoutException(msecs);
}
}
}
}
}
而Rendezvous中则是:rendezvous(Object x):
// Rendezvous.
java
public
Object
rendezvous(
Object
x)
throws
InterruptedException
, BrokenBarrierException {
return
doRendezvous(x,
false
, 0);
}
protected
Object
doRendezvous(
Object
x,
boolean
timed,
long
msecs)
throws
InterruptedException
, TimeoutException, BrokenBarrierException {
// rely on semaphore to throw interrupt on entry
long
startTime;
if
(timed) {
startTime =
System
.currentTimeMillis();
if
(!entryGate_.attempt(msecs)) {
throw
new
TimeoutException(msecs);
}
}
else
{
startTime = 0;
entryGate_.a
cq
uire();
}
synchronized
(
this
) {
Object
y =
null
;
int
index = entries_++;
slots_[index] = x;
try
{
// last one in runs function and releases
if
(entries_ == parties_) {
departures_ = entries_;
notifyAll();
try
{
if
(!broken_ && rendezvousFunction_ !=
null
)
rendezvousFunction_.rendezvousFunction(slots_);
}
catch
(
RuntimeException
ex) {
broken_ =
true
;
}
}
else
{
while
(!broken_ && departures_ < 1) {
long
timeLeft = 0;
if
(timed) {
timeLeft = msecs - (
System
.currentTimeMillis() - startTime);
if
(timeLeft <= 0) {
broken_ =
true
;
departures_ = entries_;
notifyAll();
throw
new
TimeoutException(msecs);
}
}
try
{
wait(timeLeft);
}
catch
(
InterruptedException
ex) {
if
(broken_ || departures_ > 0) {
// interrupted after release
Thread
.currentThread().interrupt();
break
;
}
else
{
broken_ =
true
;
departures_ = entries_;
notifyAll();
throw
ex;
}
}
}
}
}
finally
{
y = slots_[index];
// Last one out cleans up and allows next set of threads in
if
(--departures_ <= 0) {
for
(
int
i = 0; i < slots_.
length
; ++i) slots_[i] =
null
;
entryGate_.release(entries_);
entries_ = 0;
}
}
// continue if no IE/TO throw
if
(broken_)
throw
new
BrokenBarrierException(index);
else
return
y;
}
}
既然这样,那提供一个共用的Barrier接口还有什么意义呢?Doug Lea也觉察出了这个问题。所以在即将在JDK1.5中作为标准并发工具包发布的java.util.concurrent中,就去除了Barrier接口。
最常用的Barrier实现是CyclicBarrier,下面是CyclicBarrier的一个简单使用实例,Rendezvous的使用实例可以参考concurrent包的API文档。
class
Solver {
final
int
N;
final
float
[][] data;
final
CyclicBarrier barrier;
class
Worker
implements
Runnable
{
int
myRow;
Worker(
int
row) { myRow = row; }
public
void
run() {
while
(!done()) {
processRow(myRow);
try
{
barrier.barrier();
}
catch
(
InterruptedException
ex) {
return
; }
catch
(BrokenBarrierException ex) {
return
; }
}
}
}
public
Solver(
float
[][] matrix) {
data = matrix;
N = matrix.
length
;
barrier =
new
CyclicBarrier(N);
barrier.setBarrierCommand(
new
Runnable
() {
public
void
run() { mergeRows(...); }
});
for
(
int
i = 0; i < N; ++i) {
new
Thread
(
new
Worker(i)).start();
waitUntilDone();
}
}
原文转自:
http://www.ltesting.net
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
相关文章
软件测试中Java多线程程序四步轻松学成
解析Java的多线程机制
关于软件测试开发技术java面向对象数组的
关于软件测试开发技术Java初学者需要了解
软件测试开发技术Java多线程程序设计-区
关于Java初学者需要了解的几个基础问题
周排行
月排行
下载
让我们来聊一下UI自动化测试
一名优秀的软件测试人员应
工商银行数据中心接口冒烟
敏捷测试3.0
真实世界的全栈工程师的十
iOS 系统UI自动化测试介绍
如何面试软件测试工程师?
一篇文章读懂A/B测试背后的
五款顶级回归测试工具概述
五款顶级回归测试工具概述
对结合BDD进行DDD开发的一点
HP QTP 10 中文版官方中文补丁
HP QTP 10 英文版 下载地址
HP ALM 11 官方 中文版下载地址
Quality Center 9.0中文版 下载地
HttpWatch Basic Edition Version 7.
WIN2003+ORACLE11G+QC11(ALM11) 安装
WIN2003+SQL2005(SP3)+QC11(ALM11) 安
WIN2003+SQL2005+QC9 安装手册 下
WIN2000+SQL2000+QC9安装手册 下载
软件测试沙龙
More>>
新浪微博
More>>
热门标签
功能测试
性能测试
安全测试
本地化测试
游戏测试
web测试
单元测试
敏捷测试
测试用例
测试模版
测试管理
测试工具