多线程及其并发库笔记

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

 

1.创建线程的两种传统方式
 1.1 在Thread子类覆盖的run方法中编写运行代码
  涉及一个以往知识点:能否在run方法声明上抛出interruptedException异常,以便省略run方法内部对Thread.sleep()语句的try...catch处理?
 1.2 在传递给Thread对象的Runnable对象的run方法中编写代码
 
 总结:查看Thread类run方法的源代码,可以看到其实这两种方式都是在调用Thread对象的方法,如果Thread类的run方法没有被覆盖,并且为该Thread对象设置了
 一个Runnable,该run方法会调用Runnable对象的run方法。
 
 问题:如果在Thread子类覆盖的run方法中编写了运行代码,也为Thread的子类对象传递了一个Rubbable对象,那么,线程运行时的执行代码时子类的run方法吗?还是 Runnable对象的runnable对象的run方法代码?
  多线程机制会提高程序运行的效率吗?为什么会有多线程下载?不会提高效率,相比还会降低效率,多线程下载并不是提高了运行效率,而是多占用了服务器带宽,抢了别人的资源
 
2.传统定时器技术。
 Timer ; qualtz
 
3.传统线程互斥技术
 
4.传统线程同步通信技术
 经验:要用到共同数据(包括同步锁)或共同的算法的若干方法应该归在同一个类身上,这种设计正好体现搞类聚性和程序的健壮性
 
5.虚拟机死的时候执行:Runtime类中的addShutdownHook(Runnable hook)方法。

6.java5的线程并发库
 java.util.concurrent.atomic包。可以对基本数据,对数组中的基本数据进行,对类中的基本数据进行操作
 
 6.1 AtomicInteder 解决了多线程访问整数的安全问题
 int addAndGet(int delta)   以原子方式将给定值与当前值相加。没有减的方法,因为加上一个负数既是减去一个数。
 int getAndIncrement()    以原子方式将当前值加 1。
 还有AtomicLong、AtomicBoolean等类也解决了对应数据类型操作的问题
 AtomicIntederArary 操作数组里面的整数;
 
 6.2 AtomicIntederFieldUpdater 对对象中的整数字段进行操作
 static <U> AtomicIntegerFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName)
               使用给定字段为对象创建和返回一个更新器。
 int addAndGet(T obj, int delta)  以原子方式将给定值添加到此更新器管理的给定对象的字段当前值。

7.读写锁:读锁与写锁、写锁与写锁互斥,读锁间不互斥。经典应用:缓存类
 
8. 线程池
 ExecutorService threadPool = Executors.newFixedThreadPool(3); //固定大小的线程池
 ExecutorService threadPool = Executors.newCachedThreadPool(); //缓存(动态变化)的线程池
 ExecutorService threadPool = Executors.newSingleThreadExecutor();
  //创建单个线程,如果池子里的线程死了,会重新创建一个线程以保证一定有一个线程;(如何实现线程死了后重新启动?)
 threadPool.execute(Runnable r);
 threadPool.shutdown();//任务完成后关闭线程池
 threadPool.shutdownNow();//立刻关闭线程池
 
 ScheduledExecutorService threadPool = Executors.newscheduleThreadPool(3);
 threadPool.schedule(Runnable r, long delay, TimeUnit unit);
 threadPool.scheduleAtFixedRate(Runnable, initialDelay, period, unit);

9.Callable And Futurere
 Future<String> future = Executors.newSingleThreadExecutor().submit(
  Callable<T>(){
   public <T> call()throws Exception{...}
  });
 future.get(); //获取结果
 <T> get(long timeout, TimeUnit unit);   //如有必要,最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。
 
 ExecutorService threadPool = Executors.newFixedThreadExecutor(10);
 CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPool);
 for(int x=0;x<10;x++){
  completionService.submit(
   Callable<T>(){
    public <T> call()throws Exception{...}
   });
 }
 for(int x=0;x<10;x++){
  syso(completionService.take().get());
 }
 
10.Semaphore实现信号灯
 可以限制同时访问资源的线程个数:如有三个灯,前面三个线程拿到灯后,后面到来的线程只能等待前面的线程释放灯并拿到灯后才能执行。
 同时可以在构造器中传递参数true,使得线程执行顺序公平,即先到来的线程先拿到灯。
 Semaphore(int permits) 创建具有给定的许可数和非公平的公平设置的 Semaphore。
 Semaphore(int permits, boolean fair) 创建具有给定的许可数和给定的公平设置的 Semaphore。
 
 void acquire(); 获取灯
 void release(); 释放灯
 
 单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。
 
11.CyclicBarrier:当所有线程都到达指定目的地后再一起向下执行
  CyclicBarrier(int parties) ;
  int await();
  int getNumberWaiting(); 返回当前在屏障处等待的参与者数目。
 
 CountDownLatch:犹如倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当计数到达0时,则所有等待者或单个等待者开始执行。
 CountDownLatch(int count); 构造一个用给定计数初始化的 CountDownLatch
 void await(); 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断
 countDown(); 递减锁存器的计数,如果计数到达零,则释放所有等待的线程
 
 Exchange:实现两个线程之间的数据交换,只有当交换双方都到达时,交换才可以进行
 T exchange(T data); 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象
 
12.可阻塞队列:只有put方法和take方法才具有阻塞功能
 public interface BlockingQueue<E> extends Queue<E>
         抛出异常               特殊值                 阻塞                         超时
插入   add(e)                 offer(e)               put(e)             offer(e, time, unit)
移除  remove()               poll()                 take()             poll(time, unit)
检查 element()             peek()               不可用                    不可用
 
 ArrayBlockingQueue
 用3个空间的队列来演示阻塞队列的功能和效果。
 用两个具有1个空间的队列来实现同步通知的功能。
 阻塞队列与Semaphore有些相似,但也不同,阻塞队列是一方存放数据,另一方释放数据,Semaphore通常则是由同一方设置和释放信号量。

 

concurrent包中的一些同步集合等。

 

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值