摘要:
1. 背景在Java5的多线程中,可以使用Callable接口来实现具有返回值的线程。使用线程池的submit方法提交Callable任务,利用submit方法返回的Future存根,调用此存根的get方法来获取整个线程池中所有任务的运行结果。方法一:如果是自己写代码,应该是自己维护一个Collection保存submit方法返回的Future存根,然后在主线程中遍历这个Collection并调用Future存根的get()方法取到线程的返回值。方法二:使用CompletionService类,它整合了Executor和BlockingQueue的功能。你可以将Callable任务提交给它去执 阅读全文
摘要:
Collections工具类提供了大量针对Collection/Map的操作,总体可分为四类,都为静态(static)方法:1. 排序操作(主要针对List接口相关)reverse(List list):反转指定List集合中元素的顺序shuffle(List list):对List中的元素进行随机排序(洗牌)sort(List list):对List里的元素根据自然升序排序sort(List list, Comparator c):自定义比较器进行排序swap(List list, int i, int j):将指定List集合中i处元素和j出元素进行交换rotate(List list, 阅读全文
摘要:
Java集合大致可分为Set、List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合。Java 5之后,增加了Queue体系集合,代表一种队列集合实现。Java集合框架主要由Collection和Map两个根接口及其子接口、实现类组成。本文仅探讨Map接口及其子接口、实现类。目录1. Map接口继承树2. Map接口的基本操作3. Map的遍历4. HashMap类和Hashtable类 4.1 Properties类 4.2 LinkedHashMap类5. SortedMap接口及其TreeMap实现类6. Iden.. 阅读全文
摘要:
Java集合大致可分为Set、List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合。Java 5之后,增加了Queue体系集合,代表一种队列集合实现。Java集合框架主要由Collection和Map两个根接口及其子接口、实现类组成。本文仅探讨Collection接口及其子接口、实现类。目录1. Collection接口继承树2. Collection接口基本操作3. Collection的遍历4. Set子接口 4.1 HashSet类 4.2 LinkedHashSet类 4.3 SortedSet接口及Tree... 阅读全文
摘要:
1. 背景java.util.concurrent.atomic这个包是非常实用,解决了我们以前自己写一个同步方法来实现类似于自增长字段的问题。在Java语言中,增量操作符(++)不是原子的,也就是非线程安全的;在使用的时候,要保证数据同步,就需要使用类似于synchronized关键字等手段来保证数据正确。正因为如此,《Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)》一文中用synchronized关键字来实现一个自增长的字段。2. 实现代码如今使用java.util.concurrent.atomic包,问题简单多了。示范代码如 阅读全文
摘要:
1. ThreadPoolExecutor的一个常用的构造方法ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler) 参数说明:-corePoolSize 线程池中所保存的核心线程数。线程池启动后默认是空的,只有任务来临时才会创建线程以处理请求。prestartAllCoreThreads方法可以在线程池启动后即启动所有核心线程以等... 阅读全文
摘要:
一:newSingleThreadExecutor创建一个单线程的线程池,以无界队列方式运行。这个线程池只有一个线程在工作(如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。)此线程池能够保证所有任务的执行顺序按照任务的提交顺序执行,同一时段只有一个任务在运行。此类型线程池特别适合于需要保证执行顺序的场合。package com.clzhang.sample.thread;import java.util.concurrent.Executors;import java.util.concurrent.ExecutorService;public class ThreadPoolT 阅读全文
摘要:
如果程序不使用synchronized关键字来保证同步,而是直接使用Lock对象来保证同步,则系统中不存在隐式的同步监视器,也就不能用wait()、notify()、notifyAll()方法进行线程通信了。当使用Lock对象来保证同步时,Java提供了Condition类来协调线程间的通信。本示范简单模拟银行帐户的存取款活动,帐户余额大于等于取款金额时允许取款;帐户余额小于1000时允许存款(这与真实业务逻辑不符合,只是技术上需要才如此做的,否则存款一下子全存完就不好玩了)。1. 实体Account类package com.clzhang.sample.thread;import java. 阅读全文
摘要:
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象。本文探讨Lock对象。synchronized与java.util.concurrent.locks.Lock 的相同点:Lock能完成synchronized所实现的所有功能;主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放, 并且必须在finally从句中释放。一:先来一段简单的代码这段代码以前曾经用synchronized关键字实现同步( 阅读全文
摘要:
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象。本文探讨synchronized关键字。synchronized关键字可以修饰方法,可以修饰代码块,但不能修饰构造器、属性等。对synchronized(this)的一些理解当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。当一个线程访问object的一个synchronized(this)同步代码 阅读全文