zoukankan      html  css  js  c++  java
  • java中的Java5.0 的注释 (Annotation)、多线程包2(J2SE入门26)

    以下是调用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对象的锁池。try lock()方法会返回布尔值,这个方法是用来判断这个锁对象是不是已经被线程获取,如果返回值为true,则会直接获得这个锁对象,如果返回false,线程不会阻塞还会继续运行。

    Lock lock=new ReentrantLock();
    publci void test(){
    try{
    lock.lock();//加锁
    ..... //需要加锁的临界资源。
    }finally{
    lock.unlock();//解锁。
    }
    }




    ReadWriteLock读写锁接口

    ReentrantReadWriteLock是ReadWriteLock的实现类。

    readLock()分配读锁,读锁可以分配多个线程,但是在分配读锁后所有读锁释放前,写锁时不能分配的。
    Lock writeLock() 写锁只能分配给一个线程,在分配写锁后写锁是放前,读锁不能被分配。


    Condition接口和实现类

    await()替代了wait()方法。
    notify(),notifyAll() 在JDK5.0中已经用signal() ,signalAll()方法替换掉了,在JDK5.0中,可以使用多个等待队来存放等待的线程,并对线程进行分类。 
     
    Queue接口(Collection的子接口,对列接口)

    LinkedList也实现了这个在JDK5.0中的新接口Queue,并且这个类自动的实现了生产者和消费者的同步。

  • 相关阅读:
    SQL的join使用图解
    归并排序的JAVA实现
    java 快速排序 时间复杂度 空间复杂度 稳定性
    哈希表(HashMap)分析及实现(JAVA)
    外部排序
    海量数据面试题整理
    《CSS3秘籍》第6、7章
    《CSS3秘籍》第3-5章
    《CSS3秘籍》第1、2章
    《HTML5与CSS3基础教程》第11、14-16、18章
  • 原文地址:https://www.cnblogs.com/syxchina/p/2197215.html
Copyright © 2011-2022 走看看