- 浏览: 1101863 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
skyesx:
这是2PC实现,更常用的是一个柔性事务的实现,可以参考http ...
Spring分布式事务实现 -
ddbird:
这第一句就不严谨“分布式事务是指操作多个数据库之间的事务”,显 ...
Spring分布式事务实现 -
呵呵6666:
基于互联网支付系统的微服务架构分布式事务解决方案http:// ...
Spring分布式事务实现 -
小黄牛:
写得不错,交流群:472213887
Spring分布式事务实现 -
jiaoqf321456:
这明明是用的apache的压缩,给ant.jar有半毛钱关系吗 ...
使用ant.jar进行文件zip压缩
一、JDK5特性
二、线程安全的Set
三、Callable的使用示例
package jdk.jdk5; import java.util.Date; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Scanner; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; /************************************** * 静态导入(static import) *静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名. *import static package.className.staticField/staticMethod; **********************************/ public class JDK5 { /*************泛型(Generic)******************/ /************ * 增强了 java 的类型安全,可以在编译期间对容器内的对象进行类型检查,在运行期不必进行类型的转换。 * 而在 j2se5 之前必须在运行期动态进行容器内对象的检查及转换 ***********/ //1.<ItemType> @SuppressWarnings("serial") public class ElementList<Element> extends LinkedList<Element> { public void swap(int i, int j){ Element temp = this.get(i); this.set(i, this.get(j)); this.set(j, temp); } } //2.<T, V> @SuppressWarnings("serial") public class GenericList<T> extends LinkedList<T> { public void swap(int i, int j){ T temp = this.get(i); this.set(i, this.get(j)); this.set(j, temp); } } //3.受限泛型是指类型参数的取值范围是受到限制的 . extends 关键字不仅仅可以用来声明类的继承关系 , //也可以用来声明类型参数 (type parameter) 的受限关系 public class LimitedGeneric<T extends Number> { public double getDoubleValue(T obj){ return obj.doubleValue(); } } //4.泛型的通配符 "?" public static void print(List<?> list){ String str=""; for(Iterator it=list.iterator();it.hasNext();){ str+=it.next(); } System.out.println(str); } /*********************增加循环*****************************/ public static void forCycle(){ LinkedList<String> list = new LinkedList<String>(); list.add("Hi"); list.add("everyone!"); for (String s : list){ System.out.println(s); } } public static void printMap(Map map) { for (Object key : map.keySet()) { System.out.println(key + ":" + map.get(key)); } //不用for时 Iterator it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); Object key = entry.getKey(); Object value = entry.getValue(); System.out.println(key + ":" +value); } } /*********************可变参数 (Variable Arguments) ******/ public static int add(int ... args){ int total = 0; for (int i = 0; i < args.length; i++){ total += args[i]; } return total; } /********************枚举类(Enumeration Classes)***********/ public enum Colors {Red, Yellow, Blue, Orange, Green, Purple, Brown, Black} public enum Size{ SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL"); private Size(String abbreviation) { this.abbreviation = abbreviation; } //参数为缩写值 public String getAbbreviation() { return abbreviation; } private String abbreviation; } public enum Operation { PLUS { double eval(double x, double y) { return x + y; } }, MINUS { double eval(double x, double y) { return x - y; } }, TIMES { double eval(double x, double y) { return x * y; } }, DIVIDE { double eval(double x, double y) { return x / y; } }; // Do arithmetic op represented by this constant abstract double eval(double x, double y); } public static void testEnumType(){ System.out.println(Colors.Red); //在JDK5.0之前我们只能通过JOptionPane.showInputDialog进行输入, //但在5.0中我们可以通过类Scanner在控制台进行输入操作 Scanner in = new Scanner(System.in); System.out.print("Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE) "); String input = in.next().toUpperCase(); Size size = Enum.valueOf(Size.class, input); System.out.println("size=" + size); System.out.println("abbreviation=" + size.getAbbreviation()); if (size == Size.EXTRA_LARGE){ System.out.println("Good job--you paid attention to the _."); } System.out.println(Operation.PLUS.eval(5.0, 1.25)); } /****** * 在JDK5.0中引入了StringBuilder类,该类的方法不是同步(synchronized)的, * 这使得它比StringBuffer更加轻量级和有效。 *****/ public StringBuilder hql=new StringBuilder(); /*********************格式化I/O(Formatted I/O) ************/ public static void formatIO(){ int a = 150000, b = 10; float c = 5.0101f, d = 3.14f; System.out.printf("%4d %4d%n", a, b); System.out.printf("%x %x%n", a, b); //十六进制 System.out.printf("%3.2f %1.1f%n", c, d); System.out.printf("%1.3e %1.3e%n", c, d*100); System.out.println(new Formatter().format("%08d %s \n", 5,"string").toString()); } /*************java.util.concurrent 线程池*****************/ public class TestScheduledThread{ /**ScheduledExecutorService提供了按时间安排执行任务的功能,它提供的方法主要有: schedule(task,initDelay):安排所提交的Callable或Runnable任务在initDelay指定的时间后执行。 scheduleAtFixedRate():安排所提交的Runnable任务按指定的间隔重复执行 scheduleWithFixedDelay():安排所提交的Runnable任务在每次执行完后,等待delay所指定的时间后重复执行。 **/ @SuppressWarnings("unchecked") public void runScheduledThread() throws InterruptedException,ExecutionException{ //初始化一个ScheduledExecutorService对象,这个对象的线程池大小为2。 ScheduledExecutorService service=Executors.newScheduledThreadPool(2); Runnable task1=new Runnable(){ int count=0; public void run(){ System.out.println(new Date()+" beep"+(++count)); } }; //直接执行,以后间隔1秒执行一次 final ScheduledFuture future1=service.scheduleAtFixedRate(task1,0,1,TimeUnit.SECONDS); final ScheduledFuture future2=service.scheduleAtFixedRate(new Runnable(){ public void run(){ System.out.println("future2 runing!"); } },1,2,TimeUnit.SECONDS); ScheduledFuture future3=service.schedule(new Callable(){ public String call(){ future1.cancel(true);//取消任务 future2.cancel(true); return "taskcancelled!"; } },10,TimeUnit.SECONDS); System.out.println(future3.get()); service.shutdown();//关闭服务 } } public static void main(String[] args){ JDK5 jdk5 = new JDK5(); /* JDK5.GenericList<String> list= jdk5.new GenericList<String>(); list.add("hello!"); list.add("world!"); print(list); list.swap(0, 1); print(list); JDK5.LimitedGeneric<Integer> number = jdk5.new LimitedGeneric<Integer>(); System.out.println(number.getDoubleValue(2)); forCycle(); System.out.println(add(1,2,3,4,5)); formatIO(); testEnumType(); */ JDK5.TestScheduledThread test = jdk5.new TestScheduledThread(); try { test.runScheduledThread(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }
二、线程安全的Set
public class TestThreadSafeSet { final static Set<String> skipListSet = new ConcurrentSkipListSet();//jdk6 final static Set<String> arraySet = new CopyOnWriteArraySet();//jdk5 /** * set 的元素可以根据它们的自然顺序进行排序,也可以根据创建 set 时所提供的 Comparator 进行排序,具体取决于使用的构造方法。 * 多个线程可以安全地并发执行插入、移除和访问操作。迭代器是弱一致 的,返回的元素将反映迭代器创建时或创建后某一时刻的 set 状态。 * 它们不 抛出 ConcurrentModificationException,可以并发处理其他操作。升序排序视图及其迭代器比降序排序视图及其迭代器更快。 * 请注意,与在大多数 collection 中不同,这里的 size 方法不是 一个固定时间 (constant-time) 操作。 * 由于这些 set 的异步特性,确定元素的当前数目需要遍历元素。 * 此外,批量操作 addAll、removeAll、retainAll 和 containsAll 并不 保证能以原子方式 (atomically) 执行。 */ public static void testConcurrentSkipListSet(){ ExecutorService threadPool = Executors.newFixedThreadPool(2); threadPool.execute(new Runnable(){ int i=1000000; public void run() { while(i>0){ skipListSet.add("V_"+System.currentTimeMillis()); System.out.println("Writer_"+i+": Size = " + skipListSet.size()); i--; } } }); threadPool.execute(new Runnable(){ int i=1000000;int j=1; public void run() { while(i>0){ for(String str: skipListSet){ System.out.println("Reader_"+j+":"+str+", Size:"+skipListSet.size()); //size为遍历前的,不会实时反映,否则就是dead cycle。 } i--; j++; } } }); } /** * 所有可变的操作都首先取得后台数组的副本,对副本进行更改,然后替换副本。 * 这种做法保证了在遍历自身可更改的集合时,永远不会抛出ConcurrentModificationException。 * 遍历集合会用原来的集合完成,而在以后的操作中使用更新后的集合。这些新的集合最适合于读操作通常大大超过写操作的情况 */ public static void testCopyOnWriteArraySet(){ ExecutorService threadPool = Executors.newFixedThreadPool(2); threadPool.execute(new Runnable(){ int i=1000000; public void run() { while(i>0){ arraySet.add("V_"+System.currentTimeMillis()); System.out.println("Writer_"+i+": Size = " + arraySet.size()); i--; } } }); threadPool.execute(new Runnable(){ int i=1000000;int j=1; public void run() { while(i>0){ for(String str: arraySet){ System.out.println("Reader_"+j+":"+str+", Size:"+arraySet.size()); } i--; j++; } } }); } public static void main(String[] args){ testCopyOnWriteArraySet(); } }
三、Callable的使用示例
/** * Callable、Future和FutureTask * Callable位于java.util.concurrent包下,它也是一个泛型接口, * call()函数返回的类型就是传递进来的V类型。 * Future提供了三种功能:1)判断任务是否完成;2)能够中断任务;3)能够获取任务执行结果。 * FutureTask是Future接口的一个唯一实现类 */ public class JavaCallable { public static void main(String[] args){ new JavaCallable().testCallableAndFuture(); System.out.println("########################"); new JavaCallable().testCallableAndFutureTask(); } public void testCallableAndFuture(){ ExecutorService executor = Executors.newCachedThreadPool(); Set<Future<Integer>> resultSet = new HashSet<Future<Integer>>(); for(int i=0; i<3; i++){ CalcTask task = new CalcTask(); Future<Integer> result = executor.submit(task); resultSet.add(result); } executor.shutdown(); System.out.println("main thread execute..."); try { for(Future<Integer> result: resultSet){ System.out.println("task result " + result.get());//会阻塞,直到取到结果 } } catch (Exception e) { e.printStackTrace(); } System.out.println("all finished..."); } public void testCallableAndFutureTask(){ CalcTask task = new CalcTask(); FutureTask<Integer> futureTask = new FutureTask<Integer>(task); Thread thread = new Thread(futureTask); thread.start(); System.out.println("main thread execute..."); try { System.out.println("task result = "+futureTask.get()); } catch (Exception e) { e.printStackTrace(); } System.out.println("all finished..."); } private class CalcTask implements Callable<Integer>{ @Override public Integer call() throws Exception { Thread.sleep(1000); int sum = 0; for(int i=0;i<=100;i++) sum += i; return sum; } } }
发表评论
-
使用zxing.jar生成二维码
2015-10-15 13:52 01、ZxingCodeUtils /** * 使用Zx ... -
Java生成条形码与二维码
2015-09-29 11:02 0一、一维条形码 /** * 利用jbarcode.ja ... -
将html特殊码( &#x)转换成字符
2015-06-09 11:54 0public static void main(St ... -
Java多线程编程
2013-10-16 13:45 0一、线程安全的延迟初始化 1、基于volatile的双重检查锁 ... -
Java常用方法整理
2013-06-13 16:00 01、判断是否为中文字符 /** * 判断是否为中文 ... -
使用servicemix实现FTP连接池
2013-06-13 13:17 0一、配置文件 <?xml version=" ... -
嵌入式运行HttpServer
2015-06-30 13:14 1775一、嵌入式运行Jetty并提供上传文件功能 1、定义处理请求的 ... -
使用Quartz执行定时任务
2012-05-24 11:00 0一、在application中运用 (1)定义任务 pac ... -
Java内存泄漏分析与解决方案
2012-03-18 13:49 0作为Internet最流行的编程语言之一,Java现正非常 ... -
java访问FtpSever
2011-10-09 15:18 0使用apache common-net包来实现。 ... -
JNI(Java Native Interface)的使用
2015-06-30 13:12 3279Java JNI是Java Native Interf ... -
Java Regular Expressions Syntax
2009-07-22 20:54 3102一、正则表达式语法 1. ... -
jsp custom taglib
2009-07-10 12:20 01.java文件 public class Repeate ... -
java filter
2009-07-10 12:13 17334过滤器Filter也具有生命周期:init()-> ... -
HTTP 头部详细解释
2009-07-09 11:46 01. Accept:告诉WEB服务器 ... -
JavaMail读发邮件
2009-07-07 14:04 6320一、基本概念: SMTP(Simple Mail Tra ... -
java 验证码/Checked vs UnChecked Exception
2009-06-15 10:54 2333<一>、Java生成验证码图片 1.Servlet ... -
jsp统计在线人数和在线注册人数
2009-05-31 12:50 9222一、统计在线人数 1.监 ... -
Java TimeZone
2009-04-15 16:32 28959protected static Format form ... -
JPA是什么
2009-03-28 18:59 2450JPA全称为Java Persiste ...
相关推荐
### Java多线程-JDK5.0新增线程创建方式 #### 一、新增方式1:实现Callable接口 ##### (1)介绍 自Java 5.0起,为提高线程管理的灵活性与效率,引入了`Callable`接口,这是一种全新的创建线程的方式。与传统的`...
Java JDK 5.0是Java发展历程中的一个重要里程碑,它引入了许多创新特性,极大地提升了开发效率和代码质量。良葛格的这本学习笔记详细记录了这些关键知识点,为初学者和有经验的开发者提供了深入理解Java 5.0的宝贵...
10. **并发编程改进**:Java 5.0引入了`java.util.concurrent`包,包含了许多新的并发工具类,如`ExecutorService`、`Future`、`Callable`和`CyclicBarrier`等,帮助开发者更高效地编写多线程代码。 《良葛格Java ...
《Java2参考大全(jdk5.0)》是一本针对Java开发者的权威指南,它全面覆盖了Java 5.0版本的重要特性和技术。在这个版本中,Java引入了许多革新性的改变,极大地提升了语言的效率和可读性。本书旨在帮助开发者深入理解...
Java 5.0引入了`java.util.concurrent`包,包含了丰富的并发工具类,如线程池(ExecutorService)、并发集合(ConcurrentHashMap、CopyOnWriteArrayList等)以及Future和Callable接口,大大简化了多线程编程。...
JDK 5.0,也称为Java 5,是一个重要的版本,因为它引入了许多新特性,改进了语言语法,并对API进行了扩展。这个“jdk-1_5_0_22-linux-i586.rar_5.0版本_jdk_jdk-1_5_0_22_lakee6q_linux”文件包含了专为Linux i586...
11. **并发编程改进**:Java 5.0加强了并发编程的支持,引入了`java.util.concurrent`包,包括`Executor`框架、`Future`接口、`Callable`接口以及线程安全的数据结构如`ConcurrentHashMap`。 12. **死锁检测**:JDK...
**JDK 1.5,也被称为Java SE 5.0,是Java发展历程中的一个重要里程碑,引入了许多创新特性和改进,极大地提升了开发效率和代码质量。以下是对这些新特性的详细解析:** 1. **泛型(Generics)**: 泛型是JDK 1.5中...
生产者/消费者问题JDK5.0新增线程创建方式创建多线程的方式三:实现Callable接口使用线程池的好处创建多线程的方式四:使用线程池 原文:https://shimo.im/docs/KGCJKyrgG8rtXj3G/ 《第8章 多线程》 第8章
对于并发编程,JDK1.5引入了java.util.concurrent包,其中包括了线程池、Future、Callable接口以及CyclicBarrier和Semaphore等同步工具类,极大地丰富了并发处理能力,提升了多线程环境下的性能和可维护性。...
5. **集合框架增强**:包括`java.util.concurrent`包的引入,提供了线程安全的集合类和并发工具,如`ExecutorService`、`Future`和`Callable`接口,以及`ConcurrentHashMap`等。 6. **I/O和NIO改进**:Java 1.5引入...
9. **JDK5.0新增线程创建方式**: - 使用`ExecutorService`和`Callable`接口来创建和管理线程池。 - 使用`FutureTask`类来包装一个`Callable`对象,并将其提交到`ExecutorService`中执行。 #### 二、企业真题解析...
- JDK 5.0引入,`Callable`接口的`call()`方法可以有返回值和抛出异常,相比`Runnable`接口更加强大,适合需要返回结果或处理异常的多线程场景。 - **方式四:使用线程池** - 从JDK 5.0开始,可以通过...
泛型是Java中的一个重要特性,引入于JDK 5.0。它们允许我们在类、接口和方法中使用类型参数,从而增强了代码的类型安全性和重用性。通过泛型,我们可以限制容器类存储的数据类型,避免了强制类型转换,同时在编译时...
JDK 5.0引入了UncaughtExceptionHandler处理未捕获的异常,BlockingQueue用于线程间数据交换,Callable和Future支持带返回值的异步计算,以及Excutors工厂类简化线程池的创建。 反射(Reflection)允许在运行时检查...
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
除了上述核心语言特性的增强,JRE 1.5还包括对Java API的扩展和优化,如并发包(java.util.concurrent)的引入,提供了高级的线程管理和并发工具,如Executor框架、Future接口和Callable任务等。 对于“jre-1_5_0_...
- **JDK5.0新增类别**:`UncaughtExceptionHandler`处理未捕获异常,`Lock`和`Condition`提供更灵活的锁机制,`BlockingQueue`用于线程间的数据传递,`Callable`和`Future`提供异步计算结果,`Executors`提供线程池...