- 浏览: 143730 次
- 性别:
- 来自: 广州
最新评论
-
randyjiawenjie1:
终于遇到一个人讲清楚了
阻塞I/O,非阻塞I/O -
dxqrr:
学习了。。。。
java中堆和堆栈的区别 -
tanhong:
[color=yellow][/color] ...
“is a”和“has a”的区别 -
uuid198909:
代码看着是比较………………
JDK5新特性--java.util.concurrent Semaphore(8) -
heipark:
兄弟,咱这代码纠结了点....
JDK5新特性--java.util.concurrent Semaphore(8)
文章列表
在
实际应用中,有时候需要多个线程同时工作以完成同一件事情,而且在完成过程中,往往会等待其他线程都完成某一阶段后再执行,等所有线程都到达某一个阶段后再统一执行。
比如有几个旅行团需要途经深圳、广州、韶关、长沙最后到达武汉。旅行团中有自驾游的,有徒步的,有乘坐旅游大巴的;这些旅行团同时出发,并且每到一个目的地,都要等待其他旅行团到达此地后再同时出发,直到都到达终点站武汉。
这时候CyclicBarrier
就可以派上用场。CyclicBarrier最重要的属性就是参与者个数,另外最要方法是await()。当所有线程都调用了await()后,就表示这些线程都可以继续执行,否则就会等待。
...
- 2008-07-03 15:13
- 浏览 1175
- 评论(0)
Lock
接口
ReentrantLock
是
Lock
的具体类,
Lock
提供了以下一些方法:
lock():
请求锁定,如果锁已被别的线程锁定,调用此方法的线程被阻断进入等待状态。
tryLock()
:如果锁没被别的线程锁定,进入锁定状态,并返回
true
。若锁已被锁定,返回
false
,不进入等待状态。此方法还可带时间参数,如果锁在方法执行时已被锁定,线程将继续等待规定的时间,若还不行才返回
false
。
unlock()
:取消锁定,需要注意的是
Lock
不会自动取消,编程时必须手动解锁。
代码:
- 2008-07-03 14:35
- 浏览 1359
- 评论(0)
*1:
定义了几个任务
*2:
初始了任务执行工具。任务的执行框架将会在后面解释。
*3:
执行任务,任务启动时返回了一个
Future
对象,如果想得到任务执行的结果或者是异常可对这个
Future
对象进行操作。
Future
所含的值必须跟
Callable
所含的值对映,比如说例子中
Future
对印
Callable
*4:
任务
1
正常执行完毕,
future1.get()
会返回线程的值
*5:
任务
2
在进行一个死循环,调用
future2.cancel(true)
来中止此线程。传入的参数标明是否可打断线程,
true
表明可以打断。
- 2008-07-03 14:30
- 浏览 2579
- 评论(0)
Java自
1995
年面世以来得到了广泛得一个运用,但是对多线程编程的支持
Java
很长时间一直停留在初级阶段。在
Java 5.0
之前
Java
里的多线程编程主要是通过
Thread
类,
Runnable
接口,
Object
对象中的
wait()
、
notify()
、
...
- 2008-07-03 14:13
- 浏览 1501
- 评论(0)
本文探讨用信号量Semaphore实现互斥锁Mutex的问题
在Doug lea的那本著名的《Java并发编程—设计原则与模式》,英文名"Concurrent Programming in Java™: Design Principles and Patterns, Second Edition
",书中提到可以用信号量Semaphore实现互斥锁Mutex。虽然java中是通过synchronize关键字提供锁,并用这个基础设施实现信号量的。在有的系统中只有信号量这一原语,锁是通过信号量实现的。代码如下:
import java.util.concurrent ...
- 2008-07-03 11:26
- 浏览 2630
- 评论(1)
操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java
并发库
的Semaphore
可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,acquire()获取一个许可,如果没有就等待,而release()释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。
Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表。另外重入锁ReentrantLock也可以实现该功能,但实现上要负责些,代码也要复杂些。
下面的Demo中申明了一个只有 ...
- 2008-07-03 10:43
- 浏览 5910
- 评论(2)
本文是Sun官方以Blog形式发布的Java
核心技术窍门(Java
C
oreTechTip)中的一个。本文主要介绍了C
allable及其相关接口和类的使用,篇幅不长且易于理解,故翻译在了此处,相信对于准备或刚接触java.util.concurrent的朋友会有 ...
- 2008-07-02 14:50
- 浏览 1758
- 评论(0)
run()
和start() 是大家都很熟悉的两个方法。把希望并行处理的代码都放在run() 中;stat()
用于自动调用run(),这是JAVA的内在机制规定的。并且run()
的访问控制符必须是public,返回值必须是void(这种说法不准确,run() 没有返回值),run()不带参数。
闲话少说,我们要讲的是join(),我们首先来看个例子:
代码:
/**
* @author QingHe
* Creation on 2005-12-19
*/
public class ThreadTest implements Runnable {
public st ...
- 2008-07-02 14:24
- 浏览 6208
- 评论(4)
并
发库中的BlockingQueue
是一个比较好玩的类,顾名思义,就是阻塞队列。该类主要提供了两个方法put()和take(),前者将一个对象放到队列中,如果队列已经满了,就等待直到有空闲节点;后者从head取一个对象,如果没有对象,就等待直到有可取的对象。
下面的例子比较简单,一个读线程,用于将要处理的文件对象添加到阻塞队列中,
另外四个写线程用于取出文件对象,为了模拟写操作耗时长的特点,特让线程睡眠一段随机长度的时间。另外,该Demo也使用到了线程池和原子整型
(AtomicInteger),AtomicInteger可以在并发情况下达到原子化更新,避免使用了synchronized,而 ...
- 2008-07-02 10:57
- 浏览 2478
- 评论(0)
从
名字可以看出,CountDownLatch
是一个倒数计数的锁,当倒数到0时触发事件,也就是开锁,其他人就可以进入了。在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。
CountDownLatch最重要的方法是countDown()和await(),前者主要是倒数一次,后者是等待倒数到0,如果没有到达0,就只有阻塞等待了。
一个CountDouwnLatch实例是不能重复使用的,也就是说它是一次性的,锁一经被打开就不能再关闭使用了,如果想重复使用,请考虑使用CyclicBarrier
。
下面的例子简单的说明了CountDo ...
- 2008-07-02 09:34
- 浏览 1409
- 评论(0)
What is Software Consturction
定义问题 problem definition
需求分析 requirements planning
规划构建 construction planning
软件构架 software architecture ,高层设计 high-level design
编码与调试 coding and debugging
单元测试 unit testing
集成测试 integration testing
集成 integration
系统测试 system testing
保障维护 corrective maintenance
构建活 ...
- 2008-06-30 23:02
- 浏览 1185
- 评论(0)
在JAVA中,通过其对线程类的内嵌支持,编程人员编写多线程程序是很简易的。然而,在编程人员面前,多线程呈现出一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的、难以发现的错误。在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程。
背景
中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序。
虽然初次看来它可能显得简单,但是,你必须进行一些预警以实现期望的结果。你最好还是牢记以下的几点告诫。
首先,忘掉Thread.stop方法 ...
- 2008-06-30 22:44
- 浏览 1548
- 评论(0)
Thread.stop
, Thread.suspend
, Thread.resume
和Runtime.runFinalizersOnExit
这些终止线程运行的方法已经被废弃,使用它们是极端不安全的!
现在,如果你要安全有效地终止一个线程,应该采用以下这些方法:
1,线程正常执行完毕,正常结束。
也就是让run方法执行完毕,该线程就会正常结束。
2,监视某些条件,结束线程的不间断运行。
然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。
通常,它们执行在一个while(true)的死循环中。
如:
@Overrid ...
- 2008-06-30 11:26
- 浏览 2157
- 评论(0)
作者:老王
Eric Evans所著的《领域驱动设计》(Domain-Driven
Design:通常简称为“DDD”)一书可以说是经典中的经典,虽然“领域”的概念早就存在,但是直到这本书的出现,才让人们真正开始认真审视软件的构
建,相信你看了这 ...
- 2008-06-25 17:52
- 浏览 1280
- 评论(0)
越来越多人开始使用Java,但是他们大多数人没有做好足够的思想准备(没有接受OO思想体系相关培训
),以致不能很好驾驭Java项目,甚至
导致开发后的Java系统性能缓慢甚至经常当机。很多人觉得这是Java复杂导 ...
- 2008-06-25 17:24
- 浏览 887
- 评论(0)