`

thread jdk1.5

阅读更多

1,  <p:colorscheme colors="#ffffff,#000000,#dddddd,#000000,#a3b2c1,#cc0000,#336699,#003366"></p:colorscheme>   Semaphore    

解决资源问题。

一个计数信号量。从概念上讲,信号量维护了一个许可集合。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。

Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。例如,下面的类使用信号量控制对内容池的访问:

 class Pool {
   private static final MAX_AVAILABLE = 100;
   private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);

   public Object getItem() throws InterruptedException {
     available.acquire();
     return getNextAvailableItem();
   }

   public void putItem(Object x) {
     if (markAsUnused(x))
       available.release();
   }

   // Not a particularly efficient data structure; just for demo

   protected Object[] items = ... whatever kinds of items being managed
   protected boolean[] used = new boolean[MAX_AVAILABLE];

   protected synchronized Object getNextAvailableItem() {
     for (int i = 0; i < MAX_AVAILABLE; ++i) {
       if (!used[i]) {
          used[i] = true;
          return items[i];
       }
     }
     return null; // not reached
   }

   protected synchronized boolean markAsUnused(Object item) {
     for (int i = 0; i < MAX_AVAILABLE; ++i) {
       if (item == items[i]) {
          if (used[i]) {
            used[i] = false;
            return true;
          } else
            return false;
       }
     }
     return false;
   }

 }
 

获得一项前,每个线程必须从信号量获取许可,从而保证可以使用该项。该线程结束后,将项返回到池中并将许可返回到该信号量,从而允许其他线程获取该项。注意,调用 acquire() 时无法保持同步锁定,因为这会阻止将项返回到池中。信号量封装所需的同步,以限制对池的访问,这同维持该池本身一致性所需的同步是分开的。

将信号量初始化为 1,使得它在使用时最多只有一个可用的许可,从而可用作一个相互排斥的锁。这通常也称为二进制信号量,因为它只能有两种状态:一个可用的许可,或零个可用的许可。按此方式使用时,二进制信号量具有某种属性(与很多 Lock 实现不同),即可以由线程释放“锁定”,而不是由所有者(因为信号量没有所有权的概念)。在某些专门的上下文(如死锁恢复)中这会很有用。

此类的构造方法可选地接受一个公平 参数。当设置为 false 时,此类不对线程获取许可的顺序做任何保证。特别地,闯入 是允许的,也就是说可以在已经等待的线程前为调用 acquire() 的线程分配一个许可,从逻辑上说,就是新线程将自己置于等待线程队列的头部。当公平设置为 true 时,信号量保证对于任何调用 acquire 方法的线程而言,都按照处理它们调用这些方法的顺序(即先进先出;FIFO)来选择线程、获得许可。注意,FIFO 排序必然应用到这些方法内的指定内部执行点。所以,可能某个线程先于另一个线程调用了 acquire,但是却在该线程之后到达排序点,并且从方法返回时也类似。还要注意,非同步的 tryAcquire 方法不使用公平设置,而是使用任意可用的许可。

通常,应该将用于控制资源访问的信号量初始化为公平的,以确保所有线程都可访问资源。为其他的种类的同步控制使用信号量时,非公平排序的吞吐量优势通常要比公平考虑更为重要。

CyclicBarrier:
CyclicBarrier类似于CountDownLatch也是个计数器,不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。CyclicBarrier就象它名字的意思一样,可看成是个障碍,所有的线程必须到齐后才能一起通过这个障碍。CyclicBarrier初始时还可带一个Runnable的参数,此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。
CyclicBarrier提供以下几个方法:
  • await():进入等待
  • getParties():返回此barrier需要的线程数
  • reset():将此barrier重置
分享到:
评论

相关推荐

    java jdk1.5 z chm 中文版

    9. **死锁检测(Thread API增强)**:JDK 1.5提供了ThreadMXBean接口,可以获取线程的详细信息,包括死锁检测。 10. **NIO(New IO)**:非阻塞I/O模型,提供了Channel、Selector和Buffer等概念,提升了I/O性能,...

    java多线程小示例(jdk1.5)

    java多线程小示例,

    JDK API中文帮助文档 JDK1.5API_CN

    JDK 1.5版本的API中文文档,覆盖了该版本引入的新特性和更新内容,对于学习Java SE 5.0至关重要。 1. **Java核心技术** - **基础类库**:包括`java.lang`、`java.util`和`java.io`等核心包,涵盖了基本数据类型、...

    JDK 1.5的泛型實現(Generics in JDK 1.5)

    今天,JDK1.5終於內建泛型特性,不僅編譯器不再需要 任何外力(外掛附件)的幫助,整個 Java標準程式庫也被翻新(retrofit),許多 角落針對泛型做了改寫。 讓我們把帶有「參數化型別」(parameterized types)的 ...

    Java JDK1.5 生产消费者模式解决方案

    在JDK 1.5及以后的版本中,Java引入了`java.util.concurrent`包,其中包含了一些强大的并发工具类,如`Lock`接口和`Condition`接口,这些工具大大提升了生产者消费者模式的实现效率和线程安全性。 生产者消费者模式...

    JDK1.5线程池源码及详细注释

    JDK 1.5引入了java.util.concurrent包,其中包含了线程池的实现,使得并发编程更加便捷和高效。线程池的核心在于它的设计策略,包括核心线程数、最大线程数、线程存活时间、工作队列以及拒绝策略。 线程池的主要类...

    JavaJDK1.5中文简体API文档

    Java JDK 1.5中文简体API文档是Java开发者的重要参考资料,它包含了Java SE(标准版)1.5版本的所有核心类库、接口和方法的详细说明。这个文档是学习和理解Java编程语言的关键工具,无论是初学者还是经验丰富的...

    jdk1.5与jdk1.6的 区别

    ### JDK 1.5 与 JDK 1.6 的区别 #### 一、增强的 For 循环 在 Java 1.5 中引入了增强的 for 循环,也被称为 foreach 循环,用于简化遍历集合和数组的过程。这种循环提供了一种更加简洁和易于阅读的语法。 ##### ...

    jdk1.5+线程池应用

    使用jdk1.5 实现的线程池. 可以定制人物和其它特性. 下载后可以自己进行相关功能完善. 欢迎加QQ:934547801一起讨论

    jdk1.5 线程并发与线程池的使用

    在JDK 1.5之前,Java主要依赖于Thread类来创建和管理线程,但这种方式存在一定的局限性,如线程同步问题、资源管理不善等。JDK 1.5引入了`java.util.concurrent`包,提供了许多高级并发工具,如`ExecutorService`、`...

    scjp认证指南JDK1.6,jdk1.5

    11. **泛型**:泛型引入于JDK1.5,用于提高代码的类型安全性和重用性,理解泛型类、泛型方法和通配符的使用。 12. **枚举**:枚举是JDK1.5引入的新特性,用于定义一组固定的值,可以替代传统的常量类。 13. **异常...

    JDK1.4,1.5,1.6的区别

    #### JDK1.5 新特性 JDK1.5,也称为Java 5,是Java发展史上的一个重要里程碑,引入了许多新特性,极大地提高了开发效率和代码质量。这些新特性包括: 1. **泛型** - 泛型是一种在编译时检查类型安全,并且所有的...

    最新收集JDK1.5.0命令大全.txt

    ### JDK 1.5.0 命令大全解析 #### 1. `java.exe` - **概述**:`java.exe` 是 Java 运行时环境的核心组件之一,用于执行 `.class` 文件(即编译后的 Java 字节码)。 - **用法**: - `java [选项] 类名`:启动一个...

    Java多线程应用

    3. **Java并发工具** (thread-t050-jdk1.5-scheduledthreadpool, thread-t053-jdk1.5-cyclicbarrier, thread-t048-jdk1.5-singletaskthreadpool): - **ScheduledThreadPoolExecutor** 提供定时及周期性任务执行的...

    Java Threads Third Edition

    这本书详细对比了JDK 1.4和JDK 1.5之间的差异,帮助开发者理解不同版本下线程处理的进化与改进。 在Java编程中,线程是并发执行的程序片段,它使得一个应用程序可以在同一时间执行多个任务。Java提供了丰富的API来...

    JDK api中文版(1.6 和1.7)

    JDK 1.6相较于1.5版本,主要改进包括增强的Garbage Collection策略、改进的JDBC驱动、新的Swing组件以及对JSR 299(Web Beans)的支持。而JDK 1.7则引入了更多的语言特性,如钻石运算符、类型推断、静态导入、try-...

    中文版的JDK-API

    10. **注解(Annotation)**:自JDK 1.5开始,注解是一种元数据,可以给代码元素添加信息,用于编译时或运行时的处理。 11. **国际化和本地化**:`java.text`和`java.util.Locale`类提供了支持多种语言和文化的文本...

    Java高性能线程库(java.util.concurrent包的补充)

    一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用。该类库不提供远程的消息功能,其设计的宗旨是实现一个内存中的消息传递机制. 主要特点有: * All ...

    JDK_API_1_7_zh_CN.zip

    9. **并发工具类**:JDK 1.5引入了丰富的并发工具类,如`java.util.concurrent.locks`包中的`ReentrantLock`和`Condition`,提供了更高级的锁机制。 10. **Swing GUI**:虽然在`javax.swing`包中的Swing组件已经...

    JDK API 1.6.0.zip

    8. **注解(Annotation)**:JDK 1.5引入的新特性,可以在代码中添加元数据,用于编译时和运行时的处理,如`@Override`、`@Deprecated`等。 9. **国际化**:`java.text`和`java.util.Locale`支持多语言环境,是开发...

Global site tag (gtag.js) - Google Analytics