`
ericFang
  • 浏览: 101514 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JDK 5 并发库

    博客分类:
  • J2SE
阅读更多
场景:控制某个资源可被同时访问的个数,acquire()获取一个许可,如果没有就等待,而release()释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。
public class TestSemaphore {
	public static void main(String[] args) {
		// 线程池
		ExecutorService exec = Executors.newCachedThreadPool();
		// 只能5个线程同时访问
		final Semaphore semp = new Semaphore(5);
		// 模拟20个客户端访问
		for (int index = 0; index < 20; index++) {
			final int NO = index;
			Runnable run = new Runnable() {
				public void run() {
					try {
						// 获取允许
						semp.acquire();
						System.out.println("Accessing: " + NO);
						Thread.sleep((long) (Math.random() * 10000));
						// 访问完后,释放
						semp.release();
					} catch (InterruptedException e) {
					}
				}
			};
			exec.execute(run);
		}
		// 退出线程池
		exec.shutdown();
	}
}

分享到:
评论
5 楼 ericFang 2010-09-16  
http://www.iteye.com/topic/109150
4 楼 ericFang 2010-09-16  
场景:长时间运行的应用需要定时运行任务, 完成一些诸如统计、优化等工作,比如在电信行业中处理用户话单时,需要每隔1分钟处理话单;网站每天凌晨统计用户访问量、用户数;公司每个月的10号计算工资并进行转帐等.
public class TestScheduledThread {
	public static void main(String[] args) {
		final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
		final Runnable beeper = new Runnable() {
			int count = 0;
			public void run() {
				System.out.println(new Date() + " beep " + (++count));
			}
		};
		// 1秒钟后运行,并每隔2秒运行一次
		final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, 1, 2, SECONDS);
		// 2秒钟后运行,并每次在上次任务运行完后等待5秒后重新运行
		final ScheduledFuture<?> beeperHandle2 = scheduler.scheduleWithFixedDelay(beeper, 2, 5, SECONDS);
		// 30秒后结束关闭任务,并且关闭Scheduler
		scheduler.schedule(new Runnable() {
			public void run() {
				beeperHandle.cancel(true);
				beeperHandle2.cancel(true);
				scheduler.shutdown();
			}
		}, 30, SECONDS);
	}
}

3 楼 ericFang 2010-09-16  
场景:当倒数到0时触发事件,也就是开锁,其他人就可以进入了。在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。
public class TestCountDownLatch {
	public static void main(String[] args) throws InterruptedException {
		// 开始的倒数锁
		final CountDownLatch begin = new CountDownLatch(1);
		// 结束的倒数锁
		final CountDownLatch end = new CountDownLatch(10);
		// 十名选手
		final ExecutorService exec = Executors.newFixedThreadPool(10);
		for (int index = 0; index < 10; index++) {
			final int NO = index + 1;
			Runnable run = new Runnable() {
				public void run() {
					try {
						begin.await();//一直等待倒数到0
						Thread.sleep((long) (Math.random() * 10000));
						System.out.println("No." + NO + " arrived");
					} catch (InterruptedException e) {
					} finally {
						end.countDown();//每次倒数一次
					}
				}
			};
			exec.submit(run);
		}
		System.out.println("Game Start");
		begin.countDown();
		end.await();
		System.out.println("Game Over");
		exec.shutdown();
	}
}
2 楼 ericFang 2010-09-16  
场景:有时候在实际应用中,某些操作很耗时,但又不是不可或缺的步骤。比如用网页浏览器浏览新闻时,最重要的是要显示文字内容,至于与新闻相匹配的图片就没有那么重要的,所以此时首先保证文字信息先显示,而图片信息会后显示,但又不能不显示,由于下载图片是一个耗时的操作,所以必须一开始就得下载。
public class TestFutureTask {
	public static void main(String[] args)throws InterruptedException,
			ExecutionException {
		final ExecutorService exec = Executors.newFixedThreadPool(5);
		Callable<String> call = new Callable<String>() {
			public String call() throws Exception {
				Thread.sleep(1000 * 5);
				return "Other less important but longtime things.";
			}
		};
		Future<String> task = exec.submit(call);
		// 重要的事情
		Thread.sleep(1000 * 3);
		System.out.println("Let's do important things.");
		// 其他不重要的事情
		String obj = task.get();
		System.out.println(obj);
		// 关闭线程池
		exec.shutdown();
		System.out.println(Runtime.getRuntime().availableProcessors());
	}
}
1 楼 ericFang 2010-09-16  
场景:浏览网页时,浏览器了5个线程下载网页中的图片文件,由于图片大小、网站访问速度等诸多因素的影响,完成图片下载的时间就会有很大的不同。如果先下载完成的图片就会被先显示到界面上,反之,后下载的图片就后显示.
public class TestCompletionService {
	public static void main(String[] args) throws InterruptedException,ExecutionException {
		ExecutorService exec = Executors.newFixedThreadPool(10);
		CompletionService<String> serv = new ExecutorCompletionService<String>(exec);
		for (int index = 0; index < 5; index++) {
			final int NO = index;
			Callable<String> downImg = new Callable<String>() {
				public String call() throws Exception {
					Thread.sleep((long) (Math.random() * 10000));
					return "Downloaded Image " + NO;
				}
			};
			serv.submit(downImg);
		}
		Thread.sleep(1000 * 2);
		System.out.println("Show web content");
		for (int index = 0; index < 5; index++) {
			Future<String> task = serv.take();
			String img = task.get();
			System.out.println(img);
		}
		System.out.println("End");
		// 关闭线程池
		exec.shutdown();
	}
}

相关推荐

    JDK5中的多线程并发库.doc

    在JDK5中,Java引入了一套强大的多线程并发库,极大地提升了多线程编程的效率和安全性。这个库提供了丰富的类和接口,使得开发者能够更好地控制线程的执行、同步和通信。 1. **线程** - **线程与进程的关系**:...

    JDK5中的多线程并发库

    在JDK5中,多线程并发库引入了一系列新的特性,极大地增强了Java处理并发问题的能力。以下是关于这个主题的详细解释: 1. **线程**: - **线程与进程的关系**:进程是一个正在执行的程序实体,而线程是进程内部的...

    jdk5.zip

    在并发编程方面,JDK 5添加了java.util.concurrent包,包含了线程池、并发容器和同步工具类等高效并发工具。例如,ExecutorService和Future接口提供了异步执行任务的能力,而ConcurrentHashMap则是一种线程安全的...

    guava-jdk5

    《Guava-JDK5:Java开发者的高效工具库》 Guava是Google为Java平台推出的一个开源库,它集合了许多实用的功能,极大地提高了Java开发的效率。Guava-JDK5是Guava的一个版本,专为支持Java 5的环境而设计。这个版本...

    JDK- jdk1.8.0-211.zip

    JDK 8对并发库进行了优化,包括改进的Fork/Join框架、新的并发数据结构(如`Double-checked Locking`的替代品`AtomicReferenceFieldUpdater`)以及更好的垃圾收集器,如G1垃圾收集器。 ### 10. **模块系统(Project...

    jdk8、jdk11、jdk17版本下载

    另外,增强了内存模型,提高了并发编程的效率和安全性。JEP 391引入了适应性垃圾收集器(ZGC)作为实验性功能,其目标是在大型堆上实现低延迟的垃圾回收。此外,JDK 17还增强了JShell(也称为REPL,读-评价-打印循环...

    jdk1.6 和jdk1.8

    Java Development Kit (JDK) 是Java编程语言的核心组件,它包含了一套开发和运行Java应用程序所需的工具和库。本文将详细探讨JDK 1.6和JDK 1.8之间的主要差异,以及它们在开发过程中的应用。 JDK 1.6,也被称为Java...

    jdk1.4,jdk1.5,jdk6

    本文将深入探讨JDK 1.4、JDK 1.5(也称为Java 5)和JDK 6这三个重要版本的关键特性。 **JDK 1.4** JDK 1.4是Java发展历程中的一个里程碑,发布于2002年。这个版本引入了许多关键的新特性,包括: 1. **异常链**:...

    jdk8官方文档

    11. **并发改进**:JDK 8对并发库进行了优化,包括`ForkJoinPool`和`Parallel Streams`,提升了多线程环境下的性能。 12. **反射API的改进**:增加了`MethodHandle`和`MethodType`,提供了更底层的反射机制,增强了...

    JDK8 中文帮助文档(jdk api 1.8 google.CHM)

    JDK8对并发库也进行了增强,如`ConcurrentHashMap`的改进,新增`AtomicIntegerArray`、`LongAdder`等原子类型,以及`ForkJoinPool`和`Parallel Streams`的引入,提高了多线程环境下的性能。 **9. Nashorn ...

    jdk1.8,32位和64位版本,jdk1.8.0_131

    7. 并发改进:Java 8对并发库进行了增强,比如Fork/Join框架和Parallel Streams,这些改进使得并行编程更加高效和简单。 总之,JDK 1.8,尤其是32位和64位的版本,对于Java开发者来说是一个重要的里程碑。它不仅...

    jdk-8u5-windows-x64.exe

    9. **改进的并发库**:包括`Fork/Join框架`和`Parallel Streams`,这些改进提高了多线程编程的效率和可管理性。 10. **新的编译器和JVM优化**:JDK 8的Javac编译器和JVM进行了优化,提升了编译速度和运行时性能,...

    张孝祥Java多线程与并发库高级应用笔记

    张孝祥的Java多线程与并发库高级应用笔记涵盖了从传统线程技术到JDK1.5并发库的全面内容,不仅加深了对线程基本原理的认识,还介绍了现代Java并发编程的最佳实践。对于希望提升多线程编程技能的Java开发者来说,这是...

    jdk 1.8.chm

    JDK 1.8对并发库进行了优化,如`ForkJoinPool`和`CompletableFuture`,提供了更好的并行计算支持。`ForkJoinPool`是基于工作窃取算法的多线程池,而`CompletableFuture`则支持异步编程和复杂的链式操作。 8. **新...

    jdk1.8 中文文档

    JDK 1.8对并发编程也进行了优化,如Fork/Join框架的改进,新的并发数据结构如ConcurrentHashMap的增强,以及ThreadLocalRandom的引入,都提升了多线程环境下的性能和易用性。 **8. 类型接口** 在JDK 1.8中,可以...

    jdk10中文说明文档_CHM.zip jdk10api文档

    JDK 10改进了并发编程中的异常处理,当一个守护线程意外终止时,会自动释放它持有的锁,避免死锁的发生。 ### 4. 其他语言特性 - **封装IPv6地址的Inet6Address API**:提供更安全和高效的IPv6处理。 - **垃圾收集...

    jdk1.8压缩包下载

    Java Development Kit(JDK)是Java编程语言的核心组件,它包含了一组开发和运行Java应用程序所需的工具和库。JDK 1.8是Java历史上的一个重要版本,它引入了许多新特性,增强了性能,并且对开发者提供了更多的便利。...

    java-JDK1.7.zip java-JDK1.7.zip

    9. **并发更新集合**:并发集合库(如ConcurrentHashMap)在JDK 1.7中得到了增强,提供更好的并发性能和线程安全。 10. **新的日期和时间API**:Java 7引入了java.time包,提供了新的日期和时间API,取代了过时的...

    JDK1.8_JDK8u181

    JDK 1.8对并发库进行了优化,如Fork/Join框架的改进,以及ConcurrentHashMap的性能提升,提供了更好的并行计算能力。 **9. 其他改进** 包括新的类型推断、新的反射API、新的编译器优化等,都提升了开发效率和程序...

    jdk-11.0.1.zip

    10. **内存模型改进**:JDK 11的内存模型进行了调整,确保了并发程序的行为更加一致和可预测。 解压"jdk-11.0.1.zip"后,你会得到一个包含多个目录和文件的结构,如`bin`(包含可执行文件)、`lib`(库文件)、`...

Global site tag (gtag.js) - Google Analytics