`
jokermanager
  • 浏览: 140714 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论
文章列表
在 实际应用中,有时候需要多个线程同时工作以完成同一件事情,而且在完成过程中,往往会等待其他线程都完成某一阶段后再执行,等所有线程都到达某一个阶段后再统一执行。 比如有几个旅行团需要途经深圳、广州、韶关、长沙最后到达武汉。旅行团中有自驾游的,有徒步的,有乘坐旅游大巴的;这些旅行团同时出发,并且每到一个目的地,都要等待其他旅行团到达此地后再同时出发,直到都到达终点站武汉。 这时候CyclicBarrier 就可以派上用场。CyclicBarrier最重要的属性就是参与者个数,另外最要方法是await()。当所有线程都调用了await()后,就表示这些线程都可以继续执行,否则就会等待。 ...
Lock 接口 ReentrantLock 是 Lock 的具体类, Lock 提供了以下一些方法: lock(): 请求锁定,如果锁已被别的线程锁定,调用此方法的线程被阻断进入等待状态。 tryLock() :如果锁没被别的线程锁定,进入锁定状态,并返回 true 。若锁已被锁定,返回 false ,不进入等待状态。此方法还可带时间参数,如果锁在方法执行时已被锁定,线程将继续等待规定的时间,若还不行才返回 false 。 unlock() :取消锁定,需要注意的是 Lock 不会自动取消,编程时必须手动解锁。 代码:
*1: 定义了几个任务 *2: 初始了任务执行工具。任务的执行框架将会在后面解释。 *3: 执行任务,任务启动时返回了一个 Future 对象,如果想得到任务执行的结果或者是异常可对这个 Future 对象进行操作。 Future 所含的值必须跟 Callable 所含的值对映,比如说例子中 Future 对印 Callable *4: 任务 1 正常执行完毕, future1.get() 会返回线程的值 *5: 任务 2 在进行一个死循环,调用 future2.cancel(true) 来中止此线程。传入的参数标明是否可打断线程, true 表明可以打断。
Java自 1995 年面世以来得到了广泛得一个运用,但是对多线程编程的支持 Java 很长时间一直停留在初级阶段。在 Java 5.0 之前 Java 里的多线程编程主要是通过 Thread 类, Runnable 接口, Object 对象中的 wait() 、 notify() 、 ...
本文探讨用信号量Semaphore实现互斥锁Mutex的问题     在Doug lea的那本著名的《Java并发编程—设计原则与模式》,英文名"Concurrent Programming in Java™: Design Principles and Patterns, Second Edition ",书中提到可以用信号量Semaphore实现互斥锁Mutex。虽然java中是通过synchronize关键字提供锁,并用这个基础设施实现信号量的。在有的系统中只有信号量这一原语,锁是通过信号量实现的。代码如下: import java.util.concurrent ...
操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,acquire()获取一个许可,如果没有就等待,而release()释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。 Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表。另外重入锁ReentrantLock也可以实现该功能,但实现上要负责些,代码也要复杂些。 下面的Demo中申明了一个只有 ...
         本文是Sun官方以Blog形式发布的Java 核心技术窍门(Java C oreTechTip)中的一个。本文主要介绍了C allable及其相关接口和类的使用,篇幅不长且易于理解,故翻译在了此处,相信对于准备或刚接触java.util.concurrent的朋友会有 ...
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 ...
并 发库中的BlockingQueue 是一个比较好玩的类,顾名思义,就是阻塞队列。该类主要提供了两个方法put()和take(),前者将一个对象放到队列中,如果队列已经满了,就等待直到有空闲节点;后者从head取一个对象,如果没有对象,就等待直到有可取的对象。 下面的例子比较简单,一个读线程,用于将要处理的文件对象添加到阻塞队列中, 另外四个写线程用于取出文件对象,为了模拟写操作耗时长的特点,特让线程睡眠一段随机长度的时间。另外,该Demo也使用到了线程池和原子整型 (AtomicInteger),AtomicInteger可以在并发情况下达到原子化更新,避免使用了synchronized,而 ...
从 名字可以看出,CountDownLatch 是一个倒数计数的锁,当倒数到0时触发事件,也就是开锁,其他人就可以进入了。在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。 CountDownLatch最重要的方法是countDown()和await(),前者主要是倒数一次,后者是等待倒数到0,如果没有到达0,就只有阻塞等待了。 一个CountDouwnLatch实例是不能重复使用的,也就是说它是一次性的,锁一经被打开就不能再关闭使用了,如果想重复使用,请考虑使用CyclicBarrier 。 下面的例子简单的说明了CountDo ...
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 构建活 ...
 在JAVA中,通过其对线程类的内嵌支持,编程人员编写多线程程序是很简易的。然而,在编程人员面前,多线程呈现出一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的、难以发现的错误。在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程。 背景   中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序。   虽然初次看来它可能显得简单,但是,你必须进行一些预警以实现期望的结果。你最好还是牢记以下的几点告诫。   首先,忘掉Thread.stop方法 ...
Thread.stop , Thread.suspend , Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃,使用它们是极端不安全的!   现在,如果你要安全有效地终止一个线程,应该采用以下这些方法:   1,线程正常执行完毕,正常结束。 也就是让run方法执行完毕,该线程就会正常结束。   2,监视某些条件,结束线程的不间断运行。 然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。 通常,它们执行在一个while(true)的死循环中。 如: @Overrid ...
作者:老王 Eric Evans所著的《领域驱动设计》(Domain-Driven Design:通常简称为“DDD”)一书可以说是经典中的经典,虽然“领域”的概念早就存在,但是直到这本书的出现,才让人们真正开始认真审视软件的构 建,相信你看了这 ...
  越来越多人开始使用Java,但是他们大多数人没有做好足够的思想准备(没有接受OO思想体系相关培训 ),以致不能很好驾驭Java项目,甚至 导致开发后的Java系统性能缓慢甚至经常当机。很多人觉得这是Java复杂导 ...
Global site tag (gtag.js) - Google Analytics