java线程并发库总结

来源:互联网 发布:东软医疗软件 编辑:程序博客网 时间:2024/05/08 02:24
 

线程并发库总结:
1 线程范围内的数据共享:简单的说就是 一个线程中调用2个类(外部类或者内部类)取数据的方法而在这个线程的范围或者运行期间内数据唯一(可以事先把数据放入一个泛型的 map<Thread , Integer>中去)。此种方法在数据库的应用中比较多,入开启事务 提交事务。
Java中已经提供了这个功能的类ThreadLocal  但是数据只能放一个但是可以是集合,对象。
2 一个外部类里面有两个内部类这两个内部类如何共享数据?
都操作外部类的同一个成员:如 A内部类有B和C 外部类 B和C访问A的同一个成员(如对象)
AtomicInteger 对Integer类型的数据实现了线程同步安全,其它基础数据类型也有。
AtomicIntegerFieldUpdater可以对指定类的指定 int 字段进行原子更新,类似与反射。
线程池 上来就创建多个线程对象然后等待服务,如果需要服务的非常多而服务线程不够用则需要服务的就阻塞等,而jdk自带线程池 Executors 类(固定的线程个数,缓存的线程,单个线程(非正常结束的话会有一个线程来代替它解决如何获知线程死了的问题))并且还可以创建类似定时器功能的线程池等等,详细情况请查看Executors 类。
线程执行完后返回内容 如:
ExecutorService threadPool =  Executors.newSingleThreadExecutor();
  Future<String> future =
   threadPool.submit(
    new Callable<String>() {
     public String call() throws Exception {
      Thread.sleep(2000);
      return "hello";
     };
    }
  );
  System.out.println("等待结果");
  try {
   System.out.println("拿到结果:" + future.get());
也可在规定的时间内拿到结果如future.get(1,TimeUnit.seconds)
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
CompletionService 类 一次性的提交一组Callable任务那个先完成就先获取那个
 如以下程序 提交10个任务 然后for循环分别获取返回的值
ExecutorService threadPool2 =  Executors.newFixedThreadPool(10);
  CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPool2);
  for(int i=1;i<=10;i++){
   final int seq = i;
   completionService.submit(new Callable<Integer>() {
    @Override
    public Integer call() throws Exception {
     Thread.sleep(new Random().nextInt(5000));
     return seq;
    }
   });
  }
  for(int i=0;i<10;i++){
   try {
    System.out.println(
      completionService.take().get());
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (ExecutionException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 3 java中并发库中的锁(lock)
  Lock与synchronized功能类似但是比它更加的面向对象更加的方便
两个线程执行的代码片段要实现同步互斥的效果他们必须用同一个lock对象。锁是上在代表要操作的资源的类的内部方法中而不是线程代码中。
读写锁:多个读锁不互斥 读锁与写锁互斥 写锁与写锁互斥 (api示例更经典)
   如:ReadWriteLock rwl = new ReentrantReadWriteLock();
   关于hibeat  中User user=seeion.load(id,user.calss)
                    User user=seeion.get(id,user.calss)
      区别 第二个是直接从数据库里面把User对象取出来如果没有取到则返回null ,第二个不管数据库里面有没有都会返回User对象的代理  并发真正的User对象。
返回的代理代码如图
<img src='http://hi.csdn.net/attachment/201202/22/0_1329906803NNsu.gif' />


Condition类功能类似在传统线程技术中的wait和notify  不过可以选择性的通知任意一个Condition,需要与lock同时使用。
Semaphore  信号灯类,可以维护当前访问自身的线程个数并且提供了同步机制(前提是当只有一个信号灯的时候并且一个线程获得锁另一个线程可以释放锁),基本原理类似于信号的作用于原理。
CyclicBarrier 线程等待类:基本作用在于 当10个线程都到达了同一个点的时候再走,先到的线程等待其他没到的线程,比如 10个约定在火车站见面然后一起坐车去旅游,每个人都是一个线程,等人到齐了再一起坐车走。
CountDownLatch 相当于计时器 计时器到0 的时候线程开始走可以一个通知多个线程或者通知一个线程。
Exchager 用于实现两个线程之间的数据交换,每个线程在完成一定的事务后想与对方交换数据,第一个拿出数据的线程将一直等待第二个线程拿着数据到来时才能彼此交换数据。
简单的说就是当两个线程都到达同一个地方的时候才交换数据,比如卖毒粉的卖家在等买家(反之亦可)等买家一到达就交易然后迅速离开。
BlockingQueue有界阻塞队列,SyschronousQueue 存一个取一个的阻塞队列。
集合的同步安全 ConcurrentMap  等一些接口