`
log_cd
  • 浏览: 1101863 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

jdk5.0特性/线程安全的Set/使用Callable

阅读更多
一、JDK5特性
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;
	    }
	}
}
分享到:
评论

相关推荐

    Java多线程-JDK5.0新增线程创建方式

    ### Java多线程-JDK5.0新增线程创建方式 #### 一、新增方式1:实现Callable接口 ##### (1)介绍 自Java 5.0起,为提高线程管理的灵活性与效率,引入了`Callable`接口,这是一种全新的创建线程的方式。与传统的`...

    良葛格Java JDK 5.0学习笔记

    Java JDK 5.0是Java发展历程中的一个重要里程碑,它引入了许多创新特性,极大地提升了开发效率和代码质量。良葛格的这本学习笔记详细记录了这些关键知识点,为初学者和有经验的开发者提供了深入理解Java 5.0的宝贵...

    良葛格java jdk 5.0学习笔记

    10. **并发编程改进**:Java 5.0引入了`java.util.concurrent`包,包含了许多新的并发工具类,如`ExecutorService`、`Future`、`Callable`和`CyclicBarrier`等,帮助开发者更高效地编写多线程代码。 《良葛格Java ...

    Java2参考大全(jdk5.0)

    《Java2参考大全(jdk5.0)》是一本针对Java开发者的权威指南,它全面覆盖了Java 5.0版本的重要特性和技术。在这个版本中,Java引入了许多革新性的改变,极大地提升了语言的效率和可读性。本书旨在帮助开发者深入理解...

    良葛格java jdk 5.0学习笔记.rar

    Java 5.0引入了`java.util.concurrent`包,包含了丰富的并发工具类,如线程池(ExecutorService)、并发集合(ConcurrentHashMap、CopyOnWriteArrayList等)以及Future和Callable接口,大大简化了多线程编程。...

    jdk-1_5_0_22-linux-i586.rar_5.0版本_jdk_jdk-1_5_0_22_lakee6q_linux

    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...

    JavaAPI_5.0(中文版)

    11. **并发编程改进**:Java 5.0加强了并发编程的支持,引入了`java.util.concurrent`包,包括`Executor`框架、`Future`接口、`Callable`接口以及线程安全的数据结构如`ConcurrentHashMap`。 12. **死锁检测**:JDK...

    JDK1.5新特性

    **JDK 1.5,也被称为Java SE 5.0,是Java发展历程中的一个重要里程碑,引入了许多创新特性和改进,极大地提升了开发效率和代码质量。以下是对这些新特性的详细解析:** 1. **泛型(Generics)**: 泛型是JDK 1.5中...

    Java学习路线:day19

    生产者/消费者问题JDK5.0新增线程创建方式创建多线程的方式三:实现Callable接口使用线程池的好处创建多线程的方式四:使用线程池 原文:https://shimo.im/docs/KGCJKyrgG8rtXj3G/ 《第8章 多线程》 第8章

    jdk1.5 windows 64位官方正式版,绝对有效

    对于并发编程,JDK1.5引入了java.util.concurrent包,其中包括了线程池、Future、Callable接口以及CyclicBarrier和Semaphore等同步工具类,极大地丰富了并发处理能力,提升了多线程环境下的性能和可维护性。...

    jdk1.5.0_12.zip

    5. **集合框架增强**:包括`java.util.concurrent`包的引入,提供了线程安全的集合类和并发工具,如`ExecutorService`、`Future`和`Callable`接口,以及`ConcurrentHashMap`等。 6. **I/O和NIO改进**:Java 1.5引入...

    Java多线程-多线程知识点总结和企业真题

    9. **JDK5.0新增线程创建方式**: - 使用`ExecutorService`和`Callable`接口来创建和管理线程池。 - 使用`FutureTask`类来包装一个`Callable`对象,并将其提交到`ExecutorService`中执行。 #### 二、企业真题解析...

    javaSenior.pdf

    - JDK 5.0引入,`Callable`接口的`call()`方法可以有返回值和抛出异常,相比`Runnable`接口更加强大,适合需要返回结果或处理异常的多线程场景。 - **方式四:使用线程池** - 从JDK 5.0开始,可以通过...

    MapReduce,泛型,匿名内部类,Runnable和Callable

    泛型是Java中的一个重要特性,引入于JDK 5.0。它们允许我们在类、接口和方法中使用类型参数,从而增强了代码的类型安全性和重用性。通过泛型,我们可以限制容器类存储的数据类型,避免了强制类型转换,同时在编译时...

    java学习大纲java学习大纲.doc

    JDK 5.0引入了UncaughtExceptionHandler处理未捕获的异常,BlockingQueue用于线程间数据交换,Callable和Future支持带返回值的异步计算,以及Excutors工厂类简化线程池的创建。 反射(Reflection)允许在运行时检查...

    Java JDK实例宝典

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

    jre-1_5_0_22.zip

    除了上述核心语言特性的增强,JRE 1.5还包括对Java API的扩展和优化,如并发包(java.util.concurrent)的引入,提供了高级的线程管理和并发工具,如Executor框架、Future接口和Callable任务等。 对于“jre-1_5_0_...

    java学习笔记(下)

    - **JDK5.0新增类别**:`UncaughtExceptionHandler`处理未捕获异常,`Lock`和`Condition`提供更灵活的锁机制,`BlockingQueue`用于线程间的数据传递,`Callable`和`Future`提供异步计算结果,`Executors`提供线程池...

Global site tag (gtag.js) - Google Analytics