`

JDK1.5 Lock实例

阅读更多

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。注意,除非首先调用shutdownshutdownNow,否则isTerminated永不为true

 

ThreadPoolExecutor方法:

ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue)

       corePoolSize:池中所保存的线程数,包括空闲线程

       maximumPoolSize:池中允许的最大线程数

       keepAliveTime:当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间

       unitkeepAliveTime参数的时间单位

       workQueue:执行前用于保持任务的队列。此队列仅保持由execute方法提交的Runnable任务

 

实例1Lock锁:

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

 

实例2ReadWriteLock锁:

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

 

  • 大小: 68.7 KB
分享到:
评论

相关推荐

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

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

    java JDK 实例开发宝典

    Java JDK实例开发宝典是一本专注于Java开发实践的书籍,主要涵盖了JDK中的核心特性和常见工具的使用方法。在本书中,读者可以找到一系列精心设计的实例,旨在帮助开发者深入理解和熟练应用Java语言。以下是对书中...

    java jdk 实例宝典源码

    Java JDK实例宝典源码是Java开发者的重要参考资料,它涵盖了JDK中的各种核心类库、API及其实现的源代码。这些源码对于深入理解Java语言的底层运作机制、优化代码以及解决实际问题有着不可估量的价值。下面,我们将...

    backport-util-concurrent(2.2 /3.1)

    每个Lock实例可以有多个Condition实例,从而可以实现不同的等待集合。 2. **Phaser** - 在3.1版本中,backport-util-concurrent引入了Phaser,这是一个可重用的同步帮助器类,支持多个参与者之间的有界同步,类似...

    JDK实例开发宝典 例子 源代码 ,很经典的

    《JDK实例开发宝典》是一本以Java JDK为中心,深度剖析其功能并提供大量实践示例的资源集合。这份压缩包中包含了丰富的源代码,旨在帮助开发者深入理解和运用Java JDK的各种工具和类库,从而提升开发效率和代码质量...

    JAVA+JDK实例开发宝典

    《JAVA+JDK实例开发宝典》是一本深入浅出的Java编程教程,它通过丰富的实例,旨在帮助读者掌握Java编程的核心技术,并了解如何利用JDK进行实际开发工作。本书的特点在于实例丰富,且注释详尽,对于初学者而言,能够...

    java_JDK_实例开发宝典

    通过实例,读者可以学习如何创建和管理线程,理解线程同步和通信的概念,如synchronized关键字、wait()和notify()方法,以及Lock接口和Condition类的使用。 5. **网络编程**:Java的Socket编程允许开发者创建网络...

    java实例教材。。。

    8. **JDK 1.5的新特性**:JDK 1.5引入了许多重要改进,如自动装箱/拆箱、枚举类型、泛型、匿名内部类和foreach循环等。这些新特性简化了代码,提高了可读性和安全性。 9. **J2EE基础**:虽然描述中提到J2EE版本会在...

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

    jdk1.8中文文档.rar

    3. 方法引用来代替匿名内部类:在需要传递一个匿名内部类实例时,JDK 1.8允许直接使用方法引用来代替,简化了代码结构。 4. 新的日期和时间API:在java.time包下,JDK 1.8提供了新的日期和时间API,替代了旧有的...

    java中的Lock类和Condition类.docx

    每个Lock实例都可以创建一个或多个Condition实例,每个Condition对应一个等待队列。 - `await()`: 当前线程调用此方法后,会被阻塞并从当前条件队列中移除,直到被唤醒或被中断。 - `signal()`: 唤醒等待在当前...

    jdk 1.6 带索引 api

    JDK 1.6,也称为 Java Development Kit 1.6 或 Java SE 6,是Oracle公司发布的一个重要的Java平台版本,它在Java 1.5的基础上进行了一系列的改进和增强。这个版本的API带索引功能,使得开发者能够更快速、更有效地...

    jdk api 1.8_中文文档

    对象是类的实例,它们可以调用类中定义的方法并访问属性。 - 继承与多态:Java支持单一继承,一个子类只能继承一个父类,但通过接口可以实现多继承。多态性是面向对象编程的重要特性,允许子类对象在父类引用中运行...

    Multi person chat_jdk1.8_java编程_

    3. **使用ExecutorService和Callable接口**:JDK 1.5引入的Executor框架允许更高级别的线程管理。Callable接口与Runnable类似,但可以返回结果。使用ExecutorService可以创建线程池,有效管理线程生命周期,提高性能...

    黑马面试题总结

    - JDK 1.5引入了泛型,允许编译时类型安全检查容器类实例的具体类型。 - 泛型提供了编译时检查类型的功能,避免了运行时进行强制类型转换。 - **枚举:** - JDK 1.5支持枚举,提供了一种声明固定集合元素的方式...

    [Java参考文档].JDK_API_1_6_zh_CN.zip

    9. **泛型**:JDK 1.5引入的泛型提高了代码的类型安全性,允许在集合和其他容器中指定元素的类型,避免了强制类型转换。 10. **枚举(Enum)**:枚举是一种特殊的类,用于表示有限的固定值集合。它提供了比常量更...

    jdk中文文档

    - 类与对象:Java是一种面向对象的语言,所有程序都基于类的实例。它支持封装、继承和多态等面向对象特性。 - 数据类型:Java有基本数据类型(如int、char)和引用数据类型(如类、接口、数组)。 - 控制流:包括...

    Java+JDK+7 Learning notes.zip_java_jdk

    7. Type Inference for Generic Instance Creation:通过“钻石操作符”简化泛型实例化。 三、Java内存模型与垃圾回收 理解Java内存模型,包括堆内存、栈内存、方法区(元空间)以及程序计数器等,以及它们在JVM中...

Global site tag (gtag.js) - Google Analytics