- 浏览: 143697 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
randyjiawenjie1:
终于遇到一个人讲清楚了
阻塞I/O,非阻塞I/O -
dxqrr:
学习了。。。。
java中堆和堆栈的区别 -
tanhong:
[color=yellow][/color] ...
“is a”和“has a”的区别 -
uuid198909:
代码看着是比较………………
JDK5新特性--java.util.concurrent Semaphore(8) -
heipark:
兄弟,咱这代码纠结了点....
JDK5新特性--java.util.concurrent Semaphore(8)
Java自 1995 年面世以来得到了广泛得一个运用,但是对多线程编程的支持 Java 很长时间一直停留在初级阶段。在 Java 5.0 之前 Java 里的多线程编程主要是通过 Thread 类, Runnable 接口, Object 对象中的 wait() 、 notify() 、 notifyAll() 等方法和 synchronized 关键词来实现的。这些工具虽然能在大多数情况下解决对共享资源的管理和线程间的调度,但存在以下几个问题
1. 过于原始,拿来就能用的功能有限,即使是要实现简单的多线程功能也需要编写大量的代码。这些工具就像汇编语言一样难以学习和使用,比这更糟糕的是稍有不慎它们还可能被错误地使用,而且这样的错误很难被发现。
2. 如果使用不当,会使程序的运行效率大大降低。
3. 为了提高开发效率,简化编程,开发人员在做项目的时候往往需要写一些共享的工具来实现一些普遍适用的功能。但因为没有规范,相同的工具会被重复地开发,造成资源浪费。
4. 因为锁定的功能是通过 Synchronized 来实现的,这是一种块结构,只能对代码中的一段代码进行锁定,而且锁定是单一的。如以下代码所示:
synchronized ( lock ) { // 执行对共享资源的操作 …… } |
一些复杂的功能就很难被实现。比如说如果程序需要取得 lock A 和 lock B 来进行操作 1 ,然后需要取得 lock C 并且释放 lock A 来进行操作 2 , Java 5.0 之前的多线程框架就显得无能为力了。
因为这些问题,程序员对旧的框架一直颇有微词。这种情况一直到 Java 5.0 才有较大的改观,一系列的多线程工具包被纳入了标准库文件。这些工具包括了一个新的多线程程序的执行框架,使编程人员可方便地协调和调度线程的运行,并且新加入了一些高性能的常用的工具,使程序更容易编写,运行效率更高。本文将分类并结合例子来介绍这些新加的多线程工具。
在我们开始介绍 Java 5.0 里的新 Concurrent 工具前让我们先来看一下一个用旧的多线程工具编写的程序,这个程序里有一个 Server 线程,它需要启动两个 Component , Server 线程需等到 Component 线程完毕后再继续。相同的功能在 Synchronizer 一章里用新加的工具 CountDownLatch 有相同的实现。两个程序,孰优孰劣,哪个程序更容易编写,哪个程序更容易理解,相信大家看过之后不难得出结论。
public class ServerThread { Object concLock = new Object(); int count = 2; public void runTwoThreads() { // 启动两个线程去初始化组件 new Thread(new ComponentThread1(this)).start(); new Thread(new ComponentThread1(this)).start(); // Wait for other thread while(count != 0) { synchronized(concLock) { try { concLock.wait(); System.out.println("Wake up."); } catch (InterruptedException ie) { // 处理异常 } } } System.out.println("Server is up."); } public void callBack() { synchronized(concLock) { count--; concLock.notifyAll(); } } public static void main(String[] args){ ServerThread server = new ServerThread(); server.runTwoThreads(); } }
public class ComponentThread1 implements Runnable { private ServerThread server; public ComponentThread1(ServerThread server) { this.server = server; } public void run() { // 做组件初始化的工作 System.out.println("Do component initialization."); server.callBack(); } } |
1:三个新加的多线程包
Java 5.0 里新加入了三个多线程包: java.util.concurrent, java.util.concurrent.atomic, java.util.concurrent.locks.
- java.util.concurrent 包含了常用的多线程工具,是新的多线程工具的主体。
- java.util.concurrent.atomic 包含了不用加锁情况下就能改变值的原子变量,比如说 AtomicInteger 提供了 addAndGet() 方法。 Add 和 Get 是两个不同的操作,为了保证别的线程不干扰,以往的做法是先锁定共享的变量,然后在锁定的范围内进行两步操作。但用 AtomicInteger.addAndGet() 就不用担心锁定的事了,其内部实现保证了这两步操作是在原子量级发生的,不会被别的线程干扰。
- java.util.concurrent.locks 包包含锁定的工具。
2: Callable 和 Future接口
Callable 是类似于 Runnable 的接口,实现 Callable 接口的类和实现 Runnable 的类都是可被其它线程执行的任务。 Callable 和 Runnable 有几点不同:
- Callable 规定的方法是 call() ,而 Runnable 规定的方法是 run().
- Callable 的任务执行后可返回值,而 Runnable 的任务是不能返回值的。
- call ()方法可抛出异常,而 run ()方法是不能抛出异常的。
- 运行 Callable 任务可拿到一个 Future 对象,通过 Future 对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。
以下是 Callable 的一个例子:
public class DoCallStuff implements Callable{ // *1 private int aInt; public DoCallStuff(int aInt) { this.aInt = aInt; } public String call() throws Exception { //*2 boolean resultOk = false; if(aInt == 0){ resultOk = true; } else if(aInt == 1){ while(true){ //infinite loop System.out.println("looping...."); Thread.sleep(3000); } } else { throw new Exception("Callable terminated with Exception!"); //*3 } if(resultOk){ return "Task done."; } else { return "Task failed"; } } } |
*1: 名为 DoCallStuff 类实现了 Callable , String 将是 call 方法的返回值类型。例子中用了 String ,但可以是任何 Java 类。
*2: call 方法的返回值类型为 String ,这是和类的定义相对应的。并且可以抛出异常。
*3: call 方法可以抛出异常,如加重的斜体字所示。
以下是调用 DoCallStuff 的主程序。
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Executor { public static void main(String[] args){ //*1 DoCallStuff call1 = new DoCallStuff(0); DoCallStuff call2 = new DoCallStuff(1); DoCallStuff call3 = new DoCallStuff(2); //*2 ExecutorService es = Executors.newFixedThreadPool(3); //*3 Future future1 = es.submit(call1); Future future2 = es.submit(call2); Future future3 = es.submit(call3); try { //*4 System.out.println(future1.get()); //*5 Thread.sleep(3000); System.out.println("Thread 2 terminated? :" + future2.cancel(true)); //*6 System.out.println(future3.get()); } catch (ExecutionException ex) { ex.printStackTrace(); } catch (InterruptedException ex) { ex.printStackTrace(); } } } |
发表评论
-
JDK5新特性--java.util.concurrent ExecutorCompletionSe
2008-07-04 10:25 1290考 虑以下场景:浏览网页时,浏览器了5个线程下载网页中的图片 ... -
JDK5新特性--java.util.concurrent CyclicBarrier(3)
2008-07-03 15:13 1175在 实际应用中,有时候需要多个线程同时工作以完成同一件事情,而 ... -
java基础--Java 5.0多线程编程(3)
2008-07-03 14:35 1358Lock 接口 ReentrantLock 是 Loc ... -
java基础--Java 5.0多线程编程(2)
2008-07-03 14:30 2579*1: 定义了几个任务 *2: 初始了任务执行工具。 ... -
关于用信号量Semaphore完成互斥锁Mutex
2008-07-03 11:26 2629本文探讨用信号量Semaphore实现互斥锁Mutex的问题 ... -
JDK5新特性--java.util.concurrent Semaphore(8)
2008-07-03 10:43 5908操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Ja ... -
使用Callable返回结果
2008-07-02 14:50 1758本文是Sun ... -
Java线程join()方法的用处
2008-07-02 14:24 6208run() 和start() 是大家都很熟悉的两个方法。把希望 ... -
JDK5新特性--java.util.concurrent BlockingQueue(4)
2008-07-02 10:57 2478并 发库中的BlockingQueue 是一个比较好玩的类,顾 ... -
JDK5新特性--java.util.concurrent CountDownLatch(5)
2008-07-02 09:34 1409从 名字可以看出,CountDownLatch 是一个倒数计 ... -
中断JAVA线程
2008-06-30 22:44 1548在JAVA中,通过其对线程类的内嵌支持,编程人员编 ... -
JAVA中断线程的方法
2008-06-30 11:26 2156Thread.stop , Thread.suspend , ... -
不可变性
2008-05-28 09:29 10233.4 不可变性 为了满足同步的需要,另一种方法是使用不可变 ... -
使用不常进行修改的可变集合来减少应用程序的同步开销
2008-05-28 00:12 1327使用多个 Java 线程之间 ... -
正确理解java构造函数内非final函数
2008-05-27 21:49 1449大家都知道java构造 的使用方法吧, 可能大家都用它来进行 ... -
Java 理论和实践:变还是不变?
2008-05-27 21:28 891不变对象具备许多能更方便地使用他们的特性,包括不严格的同步需求 ... -
线程同步原则
2008-05-27 21:14 1029同步的基本规则:只要读取可能由其他线程写入的变量,或者写入随后 ... -
Java的多线程及安全性
2008-05-27 21:11 3061多线程 是一种机制, ... -
利于ThreadLocal管理Hibernate Session
2008-05-26 16:25 1157在利用Hibernate开发DAO模块时,我们和 ... -
ThreadLocal的几种误区
2008-05-26 16:10 969ThreadLocal的几种误区 最近由于需要用到 ...
相关推荐
- **并发工具包**:包括了新的并发类,如`Executor`框架、`ConcurrentHashMap`等,使得编写多线程程序更加容易。 - **泛型集合**:提供了泛型化的集合类,提高了类型安全性。 - **正则表达式引擎**:支持更强大的...
6. **多线程**:线程的创建与同步,线程池,synchronized关键字,wait()、notify()和notifyAll()方法。 7. **反射机制**:Class类的使用,通过反射动态创建对象,调用方法,获取类信息。 8. **泛型**:泛型类、...
最新Java 5.0多线程编程。
### Java 5.0 多线程编程 #### 核心知识点概述 Java 5.0 的发布标志着 Java 在并发编程领域的一个重大突破。在 Java 5.0 之前,多线程编程主要依赖于 `Thread` 类、`Runnable` 接口以及对象的 `wait()`、`notify()...
Java 5.0版本引入了许多重要的新特性和改进,其中就包括对多线程编程的加强。这一进步在Java并发API中得到了体现,尤其是`java.util.concurrent`包的引入,极大地方便了Java并发程序的开发。本文将结合Java 5.0中的...
通过以上两个新增的线程创建方式,我们可以看到Java 5.0版本在多线程编程方面的改进和增强。使用`Callable`接口和线程池不仅提高了线程管理的灵活性,还增强了程序的可扩展性和性能表现。在实际开发过程中,根据具体...
8. **多线程(Multithreading)**:Java API提供了Thread类和Runnable接口来支持多线程编程,理解和掌握线程的同步、互斥、线程池等概念对于开发高并发应用程序至关重要。 9. **I/O流(Input/Output Streams)**:...
并发处理方面,增加了并发工具类如`ExecutorService`,`Semaphore`和`CountDownLatch`等,使得多线程编程更加容易和高效。 在面向对象设计方面,Java 5.0支持注解(Annotations),这是一种元数据形式,可以用来...
8. **多线程**:Java内置对多线程的支持,通过Thread类或实现Runnable接口来创建和管理线程,理解并发编程的概念,如同步、互斥、死锁和线程池等。 9. **接口与抽象类**:接口是完全抽象的,只包含方法签名,不包含...
**Java的高级编程接口**包括四个专题:Java图形GUI编程、多线程编程、I/O编程和网络编程。 - **Java图形GUI编程**涉及Java的AWT(Abstract Window Toolkit)和Swing库,用于创建用户界面。AWT提供了基本的组件和...
- **多线程**:Java支持多线程编程,可以实现并发操作。 **用途:** - **开发应用程序**(Applications):适用于桌面应用程序、移动应用程序等。 - **开发Applet**:早期用于开发Web页面中的小应用程序或组件。 - ...
Java编程语言以其强大的功能和广泛的应用领域而备受程序员青睐,特别是在多线程、泛型、反射、输入/输出(IO)以及容器类和注解等方面的深入理解和应用,能够提升程序的性能和可维护性。本资源包聚焦于这些关键知识...
《达内JAVA TTS5.0 PDF——JAVA SE核心1》是针对初学者和有一定基础的Java开发者设计的一份详尽教程,旨在深入探讨Java Standard Edition(Java SE)的核心概念和技术。这份PDF教程出自达内教育,一家知名的IT培训...
例如,使用LRU(Least Recently Used)缓存策略来处理常用日志查询,通过多线程或异步I/O提高并发处理能力,以及利用CPU亲和性调度来减少上下文切换开销。 最后,Roclog v5.0.23.0的源码还提供了学习和研究的机会,...
1. **多线程**:Java对多线程支持非常完善,学习者将深入理解线程的创建、同步、通信以及死锁问题。可能会讲解到Thread类和Runnable接口,synchronized关键字,wait()、notify()和notifyAll()方法,以及ThreadLocal...
10. **并发API的扩展**:包括`java.util.concurrent`包,提供了线程池、并发集合、并发工具类等,极大地改善了多线程编程的体验。 这些新特性极大地提升了Java的生产力和可维护性。通过阅读中文版的Java 5.0 API...
10. **并发编程改进**:Java 5.0引入了`java.util.concurrent`包,包含各种线程安全的数据结构和并发工具类,如ExecutorService、Future、CountDownLatch和CyclicBarrier等,简化了多线程编程。 以上只是Java API ...