`

java简介以及了解java(三六)

阅读更多

*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();
}
}
}
*1: 定义了几个任务
*2: 初始了任务执行工具。任务的执行框架将会在后面解释。
*3: 执行任务,任务启动时返回了一个Future对象,如果想得到任务执行的结果或者是异常可对这个Future对象进行操
作。Future所含的值必须跟Callable所含的值对映,比如说例子中Future对印Callable
*4: 任务1正常执行完毕,future1.get()会返回线程的值
*5: 任务2在进行一个死循环,调用future2.cancel(true)来中止此线程。传入的参数标明是否可打断线程,true表明可以打
断。
*6: 任务3抛出异常,调用future3.get()时会引起异常的抛出。
运行Executor会有以下运行结果:
looping....
Task done. //*1
looping....
looping....//*2
looping....
looping....
looping....
looping....
Thread 2 terminated? :true //*3
//*4
java.util.concurrent.ExecutionException: java.lang.Exception: Callable terminated with Exception!
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:205)
at java.util.concurrent.FutureTask.get(FutureTask.java:80)
at concurrent.Executor.main(Executor.java:43)
…….
*1: 任务1正常结束
*2: 任务2是个死循环,这是它的打印结果
*3: 指示任务2被取消
*4: 在执行future3.get()时得到任务3抛出的异常
lock接口
实现类ReentrantLock
我们可以用lock对象,来对临界资源加锁调用lock对象的lock()方法,使得没有得到锁的线程阻塞,解锁则调用lock对象
的unlock()方法,并且释放锁,只有获得lock对象才能访问临界资源,如果没有获得lock对象,就会进入lock对象的锁
池。trylock()方法会返回布尔值,这个方法是用来判断这个锁对象是不是已经被线程获取,如果返回值为true,则会直接获
得这个锁对象,如果返回false,线程不会阻塞还会继续运行。
Lock lock=new ReentrantLock();
publci void test(){
try{
if(lock.trylock){//判断锁是否已经分配出去
lock.lock();
//如果锁没有被分配,就会获得锁,没有得到锁,就阻塞
}else{
......
}
.....//需要加锁的临界资源。
}finally{
lock.unlock();//解锁,释放锁。
}
}
ReadWriteLock读写锁接口
ReentrantReadWriteLock是ReadWriteLock的实现类。
ReentrantReadWriteLock的Lock readLock()方法会分配读锁对象,读锁可以分配多个线程,但是在分配读锁后所有读锁
释放前,写锁是不能被分配的。
ReentrantReadWriteLock的Lock writeLock()方法会分配写锁对象,且只能分配给一个线程,在分配写锁后,在写锁释
放前,读锁是不能被分配。
Condition接口和实现类
Condition是等待对列的对象,它是通过lock对象的newCondition()方法得到的
Condition实现类的await()替代了wait()方法。
notify(),notifyAll() 在JDK5.0中已经用Condition实现类的signal() ,signalAll()方法替换掉了,在JDK5.0中,可以使用
多个等待队来存放等待的线程,并对线程进行分类。
Queue接口(Collection的子接口,队列接口)
LinkedList也实现了这个在JDK5.0中的新接口Queue,并且这个类自动的实现了生产者和消费者的同步。
JDK5.0的高级同步
Semaphore类(信号量)也就是可以向线程分配许可证,指定许可证数量可以实现多线程的同步。
Semaphore s=new Semaphore(4);
//可以分配4个许可证,许可证都被分配出去时,得不到许可证的线程就会阻塞。
Semaphore类的acquire(…)方法,获得许可证。Semaphore类的release(…) 方法,释放一个许可证,也有相应的方法指
定释放和获得许可证的数量的方法。
CountDownLatch类
CountDownLatch中有个计数器,访问这个类的对象就会从计数器中减一,countDown()方法会将原有的设置的计数器值
减一,当countdown计数器为零时会使放所有await()的线程。
CyclicBarrier类
CyclicBarrier和CountDownLatch比较相似
CyclicBarrier在构造时给出线程数,只有等待的线程数到了构造方法中指定的数量,当最后一个线程等待后,所有的线程都
会被释放,这个类是一个多线程汇合的工具。
Exchanger类,用exchange()方法可以使两个线程间相互交换对象,在两线程的同步点,等待第二个线程。在同步点时,交
换对象,并同时被释放。

分享到:
评论

相关推荐

    Java 第1章 了解java含源代码

    在“Java 第1章 了解java含源代码”中,我们将会探讨Java的基础知识,包括它的历史、特性、语法以及如何阅读和理解Java源代码。 1. **Java的历史**:Java的诞生源于C++,由James Gosling领导的团队开发,旨在创造一...

    JAVA简介以及语言基础

    Java入门的基础资料,了解Java 语言 ; 了解Java 程序的类型 ; 掌握Java 程序运行环境的配置 ; 理解Java 虚拟机 (JVM); 了解Java的特点

    Core Java学习1(java简介与发展史)

    Java简介与发展史 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems的詹姆斯·高斯林(James Gosling)在1995年发布。它以其“一次编写,到处运行”(Write Once, Run Anywhere)的理念而闻名,因为它...

    Java 简介.ppt

    了解Java 语言 了解Java 程序的类型 掌握Java 程序运行环境的配置 理解Java 虚拟机 (JVM) 了解Java的特点

    1-Java简介以及开发环境安装1

    Java简介及开发环境安装 Java是一种广泛使用的高级编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)于1995年发布。它设计的初衷是实现“一次编写,到处运行”的跨平台能力,通过Java虚拟机(JVM)...

    Java核心编程Java 课件ppt

    1. **Java简介**:Java是由Sun Microsystems开发的,后来被Oracle公司收购。它被设计成“一次编写,到处运行”,这意味着编写的代码可以在任何支持Java的平台上运行,无需重新编译。 2. **Java环境搭建**:学习如何...

    Java虚拟机规范.Java SE 8版.zip

    书中基于全新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和Java语言实现细节的必读之作。 《Java核心技术系列:Java虚拟机规范(Java SE 8版)》共分7章。第1章从宏观的角度介绍了Java虚拟机...

    java源码包---java 源码 大量 实例

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    14.java集合转换(了解).zip

    14.java集合转换(了解).zip14.java集合转换(了解).zip14.java集合转换(了解).zip14.java集合转换(了解).zip14.java集合转换(了解).zip14.java集合转换(了解).zip14.java集合转换(了解).zip14.java集合...

    Java 汇总学习简介

    Java 汇总学习简介 Java 作为一种广泛使用的高级编程语言,其学习涵盖了许多方面。在深入探讨之前,我们先来了解一下 Java 的基本课程,包括 SL110、SL275 和 SL285,这些课程通常由 SUN 公司提供,旨在帮助初学者...

    java语言简介

    程序设计语言 了解Java平台特性 了解Java集成开发环境 使用Eclipse开发Java应用 了解Java程序结构组成 常见问题

    JAva资源网站大全

    这里不仅有Java基础知识的详细介绍,还有高级特性的深入解析,是Java开发者深入了解Java内部机制的首选之地。 ### 2. CN-Java 网址:http://www.cn-java.com/ CN-Java是一个专注于Java技术的中文社区,提供了丰富...

    JAVA核心技术.pdf

    Java语言的基本语法是学习Java的第一步,了解Java语言的基本语法可以帮助开发者更好地掌握Java语言。 2. Java面向对象编程:Java语言支持面向对象编程(OOP),它可以模拟现实世界中的对象和关系。面向对象编程的...

    Java面试题合集最新版2024.zip

    Java面试通常涵盖多个...并发编程:了解Java中的线程、同步、锁等机制,以及Java并发包中的工具类。 JVM与性能调优:对Java虚拟机(JVM)有一定了解,包括内存管理、垃圾回收等方面,并知道如何进行基本的性能调优。

    java全套笔记 来自狂神说java笔录.zip

    它包含了Java编译器(javac)、Java解释器(java)、Java文档生成器(javadoc)以及各种实用工具,如jar打包工具等。通过JDK,开发者可以编写、编译、运行和调试Java应用程序。 【IDEA(IntelliJ IDEA)】 ...

    java基础 Java开发入门到精通PPT课件 共353页.ppt

    在深入学习Java的过程中,了解Java虚拟机(JVM)的工作原理也很关键。JVM负责解释和执行Java字节码,并执行垃圾收集,自动管理内存。Java的异常处理机制保证了程序在遇到错误时能有序地处理,而Java Foundation ...

    Java2Pas(Java代码转换成Delphi代码)

    下面我们将详细探讨Java2Pas的工作原理、使用方法以及其在IT领域的应用。 首先,Java和Delphi是两种不同的编程语言,它们有着不同的语法结构和编程模型。Java是一种面向对象的语言,由Sun Microsystems(现已被...

    随机出题系统的java实现,使用java GUI和MySql数据库!

    阅读建议:此资源以开发随机出题系统学习其java GUI原理和内核,不仅是代码编写实现,也更注重内容上的需求分析和过程理解,所以比较适合java初学者了解java的使用和GUI界面的设计,并调试对应的代码。

    Java网络编程案例教程习题参考答案 .pdf

    Java程序员需要了解TCP/IP协议的工作原理和实现机制。 3. Java Socket类:Java中的Socket类是用于实现网络通信的核心类。Java程序员可以使用Socket类来创建Socket对象,并使用该对象来实现网络通信。 4. ...

    Java语言入门简介

    对Java语言的基本认识,通过本文件可以了解Java语言。

Global site tag (gtag.js) - Google Analytics