
多线程与IO专题
文章平均质量分 77
打着吊瓶写代码
你现在的气质,源于你走过的路,见过的人,读过的书。
展开
-
进阶篇:使用信号量Semaphore实现数据库连接池(十七)
我们先来看一下Semaphore 的定义;Semaphore:一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。Semaphore 通常原创 2017-04-16 08:59:49 · 2132 阅读 · 1 评论 -
进阶篇:定时任务执行之ScheduledThreadPoolExecuter(十六)
定时任务这个恐怕很多时候我们都需要用到吧...比如我们想间隔一天后执行某个定义好的任务,又或者间隔一天后执行完某个任务后,再每间1小时执行一次...当我们有这种需求的时候,ScheduledThreadPoolExecuter就派上用场啦!(注意,真正编程中,又大堆开源框架可以更好的帮你完成定时任务这个需求)ScheduledThreadPoolExecuter用法比较简单就不多说原创 2017-04-13 22:54:18 · 4379 阅读 · 0 评论 -
进阶篇:优先级队列之PriorityBlockingQueue(十五)
今天我们来讲下PriorityBlockingQueue这个队列,它是一个优先级队列,什么是优先级呢?意思就是我们可以定义队列中哪个元素可以先被取出!它与前面介绍的LinkedBlockingQueue不同的地方就是,它是可以定义优先级的!且入队的元素必须实现Comparable接口!//优先级任务class PriorityTask implements Runnabl原创 2017-04-13 22:43:29 · 3831 阅读 · 0 评论 -
进阶篇:延时队列之DelayQueue(十四)
这篇文章我们来讲讲BlockingQueue阻塞队列的另一个实现DelayQueue,先前我们的文章中有介绍LinkedBlockingQueue,而DelayQueue与之不同的是,DelayQueue里面哪怕有元素也无法取出,除非元素已经到期,而LinkedBlockingQueue只要里面有元素就可以取出!所以,你可以往DelayQueue中存放一个元素,且声明在半小时后才失效。原创 2017-04-13 22:18:27 · 846 阅读 · 0 评论 -
进阶篇:线程并行与等待之CyclicBarrier(十三)
考虑这样一个场景,假设你有多个线程,这些线程并行执行,你设置了一个目的地,你想做到的是,无论哪个线程先到达目的地,都得等待其它线程到达,当指定数量的线程都到达目的地时,才允许它们继续一起往下执行;这个时候就是CyclicBarrier的用武之地了! //一组任务并行执行,这些任务之间互相等待,直到指定的线程数都到达某一个屏障点(就是调用await的地方) ,才允许往下执行 //就原创 2017-04-13 21:56:39 · 820 阅读 · 0 评论 -
进阶篇:等待多个子线程完毕再执行主线程的方法之CountDownLatch(十二)
想一想, 有一天你想测试某个方法的性能,你可能会这么去做,你先开启多个线程,然后记录下多个线程的执行总时间,当多个线程全部执行完毕时,回到主线程将时间打印出来...问题在于,你怎么来控制主线程要在全部子线程执行完毕之后再执行呢? 你可能会想到 变量计数...主线程等待轮询... Ok,不兜圈子了,JDK的CountDownLatch类简直就是为解决这种问题而生的,我们先来看一下java的API原创 2017-04-12 22:30:35 · 1646 阅读 · 0 评论 -
进阶篇:同步阻塞队列之LinkedBlockingQueue(十一)
JDK为我们提供了多个阻塞队列的实现,什么是阻塞队列呢? 我们都知道队列就是一组数据的集合,而阻塞队列的意思是,当你往队列中取数据时,如果没有数据,你将被阻塞,一直等到拿到数据为止;今天我们就来看一下比较常用的遵循先进先出的阻塞队列LinkedBlockingQueue;//同步阻塞队列 //可以看到,当调用take()方法去拿数据时,如果里面没有数据,将造成阻塞 public sta原创 2017-04-12 22:10:34 · 1867 阅读 · 0 评论 -
基础篇:线程间的协作之生产者与消费者(十)
生产者与消费者的代码实现,这个套路基本上和上篇文章一个样,所以我就不对代码多做解释了;之所以写这篇文章是为了介绍ReentrantLock 以及方便后面的一篇采用JDK提供的队列来实现生产者与消费者的代码来与之做比较;先看输出*******************************************************************************原创 2017-04-12 21:49:25 · 640 阅读 · 0 评论 -
基础篇:线程间的协作之积累能量---放大招(九)
这篇文章我们来写一个小例子,充分利用notifyAll与wait等方法,来完成一个模拟游戏中不停的 “积累能量---放大招” 的例子!我们先看运行结果,再看代码:***********************************************************************************************开始第1次积累能量第1次积累能量原创 2017-04-12 21:22:15 · 708 阅读 · 0 评论 -
基础篇:wait与notify与notifyAll(八)
这篇文章主要讲解多线程编程中 wait与notify与notifyAll 这三个方法的运用,了解了它们的基本用法后,我们再写个 “积累能量---放大招” 的例子来整合演示这几个方法的协作运用;见名之意,wait是等待的意思,当在线程A内调用wait()时,线程A将暂停运行,直到其它的线程通过调用notify或者notifyAll方法唤醒它为止;这三个方法都是从Object类继原创 2017-04-09 19:19:23 · 781 阅读 · 0 评论 -
基础篇:让线程停止运行的几种方式(七)
这篇文章我们来讨论一下终止线程运行的方法;中断线程的方法: public static void stopThread() throws InterruptedException{ Thread t = new Thread(new Runnable() { @Override public void run() { while(!Thread.currentThr原创 2017-04-09 17:44:50 · 12056 阅读 · 0 评论 -
基础篇:资源拷贝之ThreadLocal(六)
如果你有这样的需求,在不同的线程中对某个对象的修改不会影响到其它线程中该对象的状态,那么使用ThreadLocal将是非常不错的解决方案,事实上,这种需求是很常见的;我们来演示一下ThreadLocal的工作机制://测试线程本地存储,证明对象复制与多个线程对ThreadLocal变量的修改互不影响 private static void testLocalThread() throws原创 2017-04-09 17:14:13 · 1268 阅读 · 0 评论 -
基础篇:同步机制之synchronized与ReentrantLock(五)
我们继续来探讨同步机制的话题;上一篇文章说到了使用ReentrantLock的lock()来获取锁,但有时候我们可能有这样的需求,我们先尝试着去获取锁,但等了几秒实在拿不到锁就放弃获取锁而转做其它的事情,这个需求是很常见的, 所幸的是,ReentrantLock提供了tryLock方法来帮助我们达到这样的目的;//演示锁的tryLock方法 public static void test原创 2017-04-09 16:53:57 · 647 阅读 · 0 评论 -
基础篇:同步机制之synchronized与ReentrantLock(四)
什么是同步呢?同步就是指串行访问,在单线程的情况下,不用考虑同步的问题,因为不存在并行访问,而在多线程情况下,假设我们有个取款的方法, 它可能是这样的:public static void 取款( int 款数 ){ int 余额 = get余额(); if( 余额>款数 ){ //代码1处 吐钱(); //代码2处 更新数据库余额(); }else{ System.原创 2017-04-09 16:01:42 · 526 阅读 · 0 评论 -
基础篇:线程异常处理器与join方法(三)
在线程的run方法运行过程中,有可能抛出异常,这时你可能想这么来做:class UncaughtThread implements Runnable{ @Override public void run() { System.out.println("开始处理任务..."); //打印当前线程的私有异常处理器 System.out.println(Thread.currentT原创 2017-04-09 15:24:19 · 758 阅读 · 0 评论 -
基础篇:获取线程返回值与守护线程的创建(二)
有时候,我们可能有 需要拿到线程执行完毕的返回值的需求,这时我们可用通过java.util.concurrent.Future类与Callable接口来完成,如下所示://必须实现Callable接口class MyCallable implements Callable{ private static int count = 0; private final int id = coun原创 2017-04-09 14:50:01 · 561 阅读 · 0 评论 -
基础篇:线程的创建与线程池的使用(一)
在java中,一个普通的类要成为一个可被java多线程机制调用的 "线程类" 有两种方式;继承Thread或者实现Runnable接口;如下所示:上面代码就是线程最基本的用法,创建以及启动,需要注意的是,必须调用线程类的start方法才是启动线程,调用run方法只是相当于调用一个普通的方法;我们看到,线程0和线程1毫无规律的交替执行,直到终止循环的条件shutCount的值变为0时才停止执行;在后面我们将学会采用多种互斥机制以及java提供的高级并发工具类来让线程间的执行变得有条理,而不是像这样混乱不堪原创 2017-04-09 10:56:51 · 577 阅读 · 0 评论