java多线程
思维的深度
这个作者很懒,什么都没留下…
展开
-
Java线程池详细理解
使用ThreadPoolExecutor表示一个线程池。Executors类则扮演着线程池工厂的角色,通过Executors可以获取特定功能的线程池 Executors工厂创建线程池 普通线程池 public static ExecutorService newFixedThreadPool(int nThreads) public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFact原创 2020-05-15 18:34:49 · 326 阅读 · 0 评论 -
Java CyclicBarrier使用
使用说明栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到指定数量的线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏将被重置以便下次使用。 构造器 CyclicBarrier默认的构造方法是Cyclic..原创 2020-05-15 18:31:09 · 232 阅读 · 0 评论 -
Java CountDownLatch 使用
使用Java的concurrent包里面的CountDownLatch是一个非常实用的多线程控制工具类,其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数器里面的值。public CountDownLatch(int count) 构造器,实例化一个倒计时器,count指定计数个数public void countDown() //计数减1public void await() throws Interr.原创 2020-05-15 18:29:10 · 348 阅读 · 0 评论 -
Java Semaphore使用
使用Semaphore:信号量,用于控制多个线程访问资源 void acquire() throws InterruptedException尝试获取一个准入的许可。如果无法获得,则线程等待,直到获取许可或者当前线程被中断void acquireUninterruptibly() 尝试获取一个准入的标准。如果无法获得,则线程等待,不能呗线程中断。boolean tryAcquire 尝试获取一个许可,如果成功获取则返回true,否则返回false,它不会进行等待,立即返回 bool原创 2020-05-15 18:27:12 · 270 阅读 · 0 评论 -
Java Condition使用
使用Condition是个接口,基本的方法就是await()和signal()方法;Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用 void await() throws InterruptedException; 调用前需要先获取锁,使当前线程等待,同时释放当前锁,.原创 2020-05-15 18:23:10 · 453 阅读 · 0 评论 -
Java线程协作join使用
介绍public final void join() throws InterruptedException阻塞当前线程直到目标线程执行完毕public final synchronized void join(long millis) throws InterruptedException阻塞当前线程直到目标线程执行完毕或等待时间超过指定时间(ms)示例pu...原创 2020-05-07 18:27:23 · 220 阅读 · 0 评论 -
Java线程协作wait和notify使用示例
介绍 Object的 wait()和notify()用于线程间协作 wait()方法 当在一个对象实例上调用wait()方法后,当前线程就会在这个对象上等待 notify() 当object.notify()方法被调用时,就会从这个对象的等待队列中随机选择一个线程,并将其唤醒 notifyAll() 唤醒该对象的所有等待线程 wait()和notify()不能随便调用,必须...原创 2020-05-07 18:23:31 · 496 阅读 · 0 评论 -
Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中转载 2017-05-10 17:00:14 · 348 阅读 · 0 评论 -
Java并发编程:Timer和TimerTask
Java并发编程:Timer和TimerTask 下面内容转载自: http://blog.csdn.net/xieyuooo/article/details/8607220 其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来实现,例如这样:12转载 2017-05-10 16:59:04 · 290 阅读 · 0 评论 -
Java并发编程:深入剖析ThreadLocal
Java并发编程:深入剖析ThreadLocal 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。 以下是本文目录大纲: 一.对ThreadLocal的理解 二.转载 2017-05-10 16:56:26 · 331 阅读 · 0 评论 -
Java并发编程:volatile关键字解析
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模转载 2017-05-10 16:54:30 · 569 阅读 · 0 评论 -
Java并发编程:synchronized
Java并发编程:synchronized 虽然多线程编程极大地提高了效率,但是也会带来一定的隐患。比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据。今天我们就来一起讨论下线程安全问题,以及Java中提供了什么机制来解决线程安全问题。 以下是本文的目录大纲: 一.什么时候会出现线程安全问题? 二.如何解决线程安全问题? 三.sy转载 2017-05-10 16:51:03 · 400 阅读 · 0 评论 -
Java并发编程:Lock
Java并发编程:Lock 在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。 也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐转载 2017-05-10 16:52:41 · 326 阅读 · 0 评论 -
Java并发编程:Callable、Future和FutureTask
Java并发编程:Callable、Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。 而自从Java 1.5开始,转载 2017-05-10 16:57:58 · 290 阅读 · 0 评论 -
线程的五大状态
线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。 1.新建状态(New): 当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始运行线程中的代码 2.就绪状态(Runnable)转载 2017-05-18 09:32:33 · 377 阅读 · 0 评论 -
java多线程核心接口 — ExecutorService 的理解与使用
接口 Java.util.concurrent.ExecutorService 表述了异步执行的机制,并且可以让任务在后台执行。壹個 ExecutorService 实例因此特别像壹個线程池。事实上,在 Java.util.concurrent 包中的 ExecutorService 的实现就是壹個线程池的实现。ExecutorService 样例这里有壹個简单的使用Java 实现翻译 2017-05-10 15:49:55 · 910 阅读 · 0 评论 -
Java并发编程:阻塞队列
Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(Linke转载 2017-05-10 16:42:19 · 282 阅读 · 0 评论 -
Java并发编程:并发容器之ConcurrentHashMap
Java并发编程:并发容器之ConcurrentHashMap下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发转载 2017-05-10 16:44:41 · 416 阅读 · 0 评论 -
Java并发编程:Thread类的使用
今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知识:线程的几种状态、上下文切换,然后接着介绍Thread类中的方法的具体使用。 以下是本文的目录大纲: 一.线程的状态 二.上下文切换 三.Thread类中的方法 若有不正之处,请多多谅解并欢迎批评指正。 请尊重作者劳动成果,转载请标明原文链接: http://www.cnbl转载 2017-05-10 16:46:53 · 520 阅读 · 0 评论 -
Java并发编程:如何创建线程?
Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务。下面先讲述一下Java中的应用程序和进程相关的概念知识,然后再阐述如何创建线程以及如何创建进程。下面是本文的目录大纲: 一.Java中关于应用程序和进程相关的概念 二.Java中如何创建线程 三.Java中如何创建进程 若有不转载 2017-05-10 16:49:00 · 401 阅读 · 0 评论 -
Java多线程基础:进程和线程之由来
Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程。当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不断积累。由于并发肯定涉及到多线程,因此在进入并发编程主题之前,我们先来了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助。 下面是本文的目录大纲:转载 2017-05-10 16:49:59 · 398 阅读 · 0 评论 -
java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任转载 2017-05-10 16:39:51 · 846 阅读 · 0 评论