JDK1.5 Lock实例
Executors类主要方法:
a. static ExecutorService newCachedThreadPool()
产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用
b. static ExecutorService newFixedThreadPool(int poolSize)
产生一个ExecutorService对象,这个对象带有一个大小为poolSize的线程池,若任务数量大于poolSize,任务会被放在一个queue里顺序执行
c. static ExecutorService newSingleThreadExecutor()
产生一个ExecutorService对象,这个对象只有一个线程可用来执行任务,若任务多于一个,任务将按先后顺序执行
Executor接口方法:
void execute(Runnable command)
在未来某个时间执行给定的命令
ExecutorService接口方法:
a. void execute(Runnable command)
继承自Executor接口
b. void shutdown()
启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用
c. List<Runnable> shutdownNow()
试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。无法保证能够停止正在处理的活动执行任务,但是会尽力尝试
d. boolean awaitTermination(long timeout,TimeUnit unit)
请求关闭、发生超时或者当前线程中断,无论哪一个首先发生之后,都将导致阻塞,直到所有任务完成执行
e. boolean isShutdown()
如果此执行程序已关闭,则返回true
f. boolean isTerminated()
如果关闭后所有任务都已完成,则返回true。注意,除非首先调用shutdown或shutdownNow,否则isTerminated永不为true
ThreadPoolExecutor方法:
ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue)
corePoolSize:池中所保存的线程数,包括空闲线程
maximumPoolSize:池中允许的最大线程数
keepAliveTime:当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间
unit:keepAliveTime参数的时间单位
workQueue:执行前用于保持任务的队列。此队列仅保持由execute方法提交的Runnable任务
实例1,Lock锁:
package com.bijian.thread; public class MyCount { private String oid; // 账号 private int cash; // 账户余额 MyCount(String oid, int cash) { this.oid = oid; this.cash = cash; } public String getOid() { return oid; } public void setOid(String oid) { this.oid = oid; } public int getCash() { return cash; } public void setCash(int cash) { this.cash = cash; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("MyCount [oid="); builder.append(oid); builder.append(", cash="); builder.append(cash); builder.append("]"); return builder.toString(); } }
package com.bijian.thread; import java.util.concurrent.locks.Lock; public class User implements Runnable { private String name; // 用户名 private MyCount myCount; // 所要操作的账户 private int iocash; // 操作的金额,当然有正负之分了 private Lock myLock; // 执行操作所需的锁对象 User(String name, MyCount myCount, int iocash, Lock myLock) { this.name = name; this.myCount = myCount; this.iocash = iocash; this.myLock = myLock; } public void run() { try { // 获取锁 myLock.lock(); // 执行现金业务 System.out.println(name + "正在操作" + myCount + "账户,金额为" + iocash + ",当前金额为" + myCount.getCash()); myCount.setCash(myCount.getCash() + iocash); System.out.println(name + "操作" + myCount + "账户成功,金额为" + iocash + ",当前金额为" + myCount.getCash()); // 释放锁,否则别的线程没有机会执行了 } finally { myLock.unlock(); } } }
package com.bijian.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Main { /** * @param args */ public static void main(String[] args) { // 创建并发访问的账户 MyCount myCount = new MyCount("95599200901215522", 10000); // 创建一个锁对象 Lock lock = new ReentrantLock(); // 创建一个线程池 ExecutorService pool = Executors.newCachedThreadPool(); // 创建一些并发访问用户,一个信用卡,存的存,取的取,好热闹啊 User u1 = new User("张三", myCount, -4000, lock); User u2 = new User("张三他爹", myCount, 6000, lock); User u3 = new User("张三他弟", myCount, -8000, lock); User u4 = new User("张三", myCount, 800, lock); // 在线程池中执行各个用户的操作 pool.execute(u1); pool.execute(u2); pool.execute(u3); pool.execute(u4); // 关闭线程池 pool.shutdown(); } }
运行结果:
张三正在操作MyCount [oid=95599200901215522, cash=10000]账户,金额为-4000,当前金额为10000 张三操作MyCount [oid=95599200901215522, cash=6000]账户成功,金额为-4000,当前金额为6000 张三正在操作MyCount [oid=95599200901215522, cash=6000]账户,金额为800,当前金额为6000 张三操作MyCount [oid=95599200901215522, cash=6800]账户成功,金额为800,当前金额为6800 张三他爹正在操作MyCount [oid=95599200901215522, cash=6800]账户,金额为6000,当前金额为6800 张三他爹操作MyCount [oid=95599200901215522, cash=12800]账户成功,金额为6000,当前金额为12800 张三他弟正在操作MyCount [oid=95599200901215522, cash=12800]账户,金额为-8000,当前金额为12800 张三他弟操作MyCount [oid=95599200901215522, cash=4800]账户成功,金额为-8000,当前金额为4800
实例2,ReadWriteLock锁:
package com.bijian.thread; import java.util.concurrent.locks.ReadWriteLock; public class User implements Runnable { private String name; // 用户名 private MyCount myCount; // 所要操作的账户 private int iocash; // 操作的金额,当然有正负之分了 private ReadWriteLock myLock; // 执行操作所需的锁对象 private boolean ischeck; User(String name, MyCount myCount, int iocash, ReadWriteLock myLock, boolean ischeck) { this.name = name; this.myCount = myCount; this.iocash = iocash; this.myLock = myLock; this.ischeck = ischeck; } public void run() { if (ischeck) { // 获取读锁 myLock.readLock().lock(); System.out.println("读:" + name + "正在查询" + myCount + "账户,当前金额为" + myCount.getCash()); // 释放读锁 myLock.readLock().unlock(); } else { // 获取写锁 myLock.writeLock().lock(); // 执行现金业务 System.out.println("写:" + name + "正在操作" + myCount + "账户,金额为" + iocash + ",当前金额为" + myCount.getCash()); myCount.setCash(myCount.getCash() + iocash); System.out.println("写:" + name + "操作" + myCount + "账户成功,金额为" + iocash + ",当前金额为" + myCount.getCash()); // 释放写锁 myLock.writeLock().unlock(); } } }
package com.bijian.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class Main { /** * @param args */ public static void main(String[] args) { // 创建并发访问的账户 MyCount myCount = new MyCount("95599200901215522", 10000); // 创建一个锁对象 ReadWriteLock lock = new ReentrantReadWriteLock(); // 创建一个线程池 ExecutorService pool = Executors.newFixedThreadPool(2); // 创建一些并发访问用户,一个信用卡,存的存,取的取,好热闹啊 User u1 = new User("张三", myCount, -4000, lock, false); User u2 = new User("张三他爹", myCount, 6000, lock, false); User u3 = new User("张三他弟", myCount, -8000, lock, false); User u4 = new User("张三", myCount, 800, lock, false); User u5 = new User("张三他爹", myCount, 0, lock, true); // 在线程池中执行各个用户的操作 pool.execute(u1); pool.execute(u2); pool.execute(u3); pool.execute(u4); pool.execute(u5); // 关闭线程池 pool.shutdown(); } }
运行结果:
写:张三正在操作MyCount [oid=95599200901215522, cash=10000]账户,金额为-4000,当前金额为10000 写:张三操作MyCount [oid=95599200901215522, cash=6000]账户成功,金额为-4000,当前金额为6000 写:张三他爹正在操作MyCount [oid=95599200901215522, cash=6000]账户,金额为6000,当前金额为6000 写:张三他爹操作MyCount [oid=95599200901215522, cash=12000]账户成功,金额为6000,当前金额为12000 写:张三正在操作MyCount [oid=95599200901215522, cash=12000]账户,金额为800,当前金额为12000 写:张三操作MyCount [oid=95599200901215522, cash=12800]账户成功,金额为800,当前金额为12800 写:张三他弟正在操作MyCount [oid=95599200901215522, cash=12800]账户,金额为-8000,当前金额为12800 写:张三他弟操作MyCount [oid=95599200901215522, cash=4800]账户成功,金额为-8000,当前金额为4800 读:张三他爹正在查询MyCount [oid=95599200901215522, cash=4800]账户,当前金额为4800
相关推荐
在JDK 1.5及以后的版本中,Java引入了`java.util.concurrent`包,其中包含了一些强大的并发工具类,如`Lock`接口和`Condition`接口,这些工具大大提升了生产者消费者模式的实现效率和线程安全性。 生产者消费者模式...
Java JDK实例开发宝典是一本专注于Java开发实践的书籍,主要涵盖了JDK中的核心特性和常见工具的使用方法。在本书中,读者可以找到一系列精心设计的实例,旨在帮助开发者深入理解和熟练应用Java语言。以下是对书中...
Java JDK实例宝典源码是Java开发者的重要参考资料,它涵盖了JDK中的各种核心类库、API及其实现的源代码。这些源码对于深入理解Java语言的底层运作机制、优化代码以及解决实际问题有着不可估量的价值。下面,我们将...
每个Lock实例可以有多个Condition实例,从而可以实现不同的等待集合。 2. **Phaser** - 在3.1版本中,backport-util-concurrent引入了Phaser,这是一个可重用的同步帮助器类,支持多个参与者之间的有界同步,类似...
《JDK实例开发宝典》是一本以Java JDK为中心,深度剖析其功能并提供大量实践示例的资源集合。这份压缩包中包含了丰富的源代码,旨在帮助开发者深入理解和运用Java JDK的各种工具和类库,从而提升开发效率和代码质量...
《JAVA+JDK实例开发宝典》是一本深入浅出的Java编程教程,它通过丰富的实例,旨在帮助读者掌握Java编程的核心技术,并了解如何利用JDK进行实际开发工作。本书的特点在于实例丰富,且注释详尽,对于初学者而言,能够...
通过实例,读者可以学习如何创建和管理线程,理解线程同步和通信的概念,如synchronized关键字、wait()和notify()方法,以及Lock接口和Condition类的使用。 5. **网络编程**:Java的Socket编程允许开发者创建网络...
8. **JDK 1.5的新特性**:JDK 1.5引入了许多重要改进,如自动装箱/拆箱、枚举类型、泛型、匿名内部类和foreach循环等。这些新特性简化了代码,提高了可读性和安全性。 9. **J2EE基础**:虽然描述中提到J2EE版本会在...
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
3. 方法引用来代替匿名内部类:在需要传递一个匿名内部类实例时,JDK 1.8允许直接使用方法引用来代替,简化了代码结构。 4. 新的日期和时间API:在java.time包下,JDK 1.8提供了新的日期和时间API,替代了旧有的...
每个Lock实例都可以创建一个或多个Condition实例,每个Condition对应一个等待队列。 - `await()`: 当前线程调用此方法后,会被阻塞并从当前条件队列中移除,直到被唤醒或被中断。 - `signal()`: 唤醒等待在当前...
JDK 1.6,也称为 Java Development Kit 1.6 或 Java SE 6,是Oracle公司发布的一个重要的Java平台版本,它在Java 1.5的基础上进行了一系列的改进和增强。这个版本的API带索引功能,使得开发者能够更快速、更有效地...
对象是类的实例,它们可以调用类中定义的方法并访问属性。 - 继承与多态:Java支持单一继承,一个子类只能继承一个父类,但通过接口可以实现多继承。多态性是面向对象编程的重要特性,允许子类对象在父类引用中运行...
3. **使用ExecutorService和Callable接口**:JDK 1.5引入的Executor框架允许更高级别的线程管理。Callable接口与Runnable类似,但可以返回结果。使用ExecutorService可以创建线程池,有效管理线程生命周期,提高性能...
- JDK 1.5引入了泛型,允许编译时类型安全检查容器类实例的具体类型。 - 泛型提供了编译时检查类型的功能,避免了运行时进行强制类型转换。 - **枚举:** - JDK 1.5支持枚举,提供了一种声明固定集合元素的方式...
9. **泛型**:JDK 1.5引入的泛型提高了代码的类型安全性,允许在集合和其他容器中指定元素的类型,避免了强制类型转换。 10. **枚举(Enum)**:枚举是一种特殊的类,用于表示有限的固定值集合。它提供了比常量更...
- 类与对象:Java是一种面向对象的语言,所有程序都基于类的实例。它支持封装、继承和多态等面向对象特性。 - 数据类型:Java有基本数据类型(如int、char)和引用数据类型(如类、接口、数组)。 - 控制流:包括...
7. Type Inference for Generic Instance Creation:通过“钻石操作符”简化泛型实例化。 三、Java内存模型与垃圾回收 理解Java内存模型,包括堆内存、栈内存、方法区(元空间)以及程序计数器等,以及它们在JVM中...