2019年6月16日
摘要:
1. Fork/Join模式 线程池可以高效执行大量小任务: Fork/Join线程池可以执行一种特殊的任务: 把一个大任务拆成多个小任务并行执行 Fork/Join是在JDK 1.7引入的 Fork/Join模式的应用: java.util.Arrays.parallelSort(array):方
阅读全文
posted @ 2019-06-16 21:55
singleSpace
阅读(421)
推荐(0)
摘要:
1. 使用Future不能自动获得异步执行结果 使用Future获得异步执行结果: 但是当我们使用get()获得异步执行结果的时候,这个方法可能会阻塞。 还可以通过while循环反复调用isDone()来判断异步结果是否已经完成。 所以使用Future获得异步执行的结果有2个方法: 1.调用阻塞方法
阅读全文
posted @ 2019-06-16 15:50
singleSpace
阅读(749)
推荐(1)
2019年6月13日
摘要:
1. Runnable接口的限制 JDK提供了ExecutorService接口表示线程池,可以通过submit提交一个任务。 但这里的task有个问题,因为继承制Runnable,如果希望返回一个结果,只能用result来表示,这样主线程获取结果,就很不方便。 因此JDK又提供了一个Callabl
阅读全文
posted @ 2019-06-13 22:37
singleSpace
阅读(302)
推荐(0)
摘要:
1. 线程池 Java语言内置多线程支持: 创建线程需要操作系统资源(线程资源,栈空间) 频繁创建和销毁线程需要消耗大量时间 假设我们有大量的小任务,可以让它排队执行,然后在一个线程池里有少量的线程来执行大量的任务。 使用线程池来复用线程,可以非常高效的执行大量小任务。 线程池: 线程池维护若干个线
阅读全文
posted @ 2019-06-13 21:57
singleSpace
阅读(341)
推荐(0)
摘要:
1. Atomic java.util.concurrent.atomic提供了一组原子类型操作。如AtomicInteger提供了 1.1 无锁线程安全 Atomic类可以实现无锁(lock free)的线程安全(thread safe)访问 原理:CAS(Compare and Set)如果At
阅读全文
posted @ 2019-06-13 19:01
singleSpace
阅读(216)
推荐(0)
摘要:
1. Concurrent 用ReentrantLock+Condition实现Blocking Queue。 Blocking Queue:当一个线程调用这个Queue的getTask()时,该方法内部可能让给线程变成等待状态,直到条件满足。线程被唤醒以后,getTask()才会返回。 而java
阅读全文
posted @ 2019-06-13 14:20
singleSpace
阅读(295)
推荐(0)
2019年6月12日
摘要:
1.Condition实现等待和唤醒线程 java.util.locks.ReentrantLock用于替代synchronized加锁 但是synchronized可以使用wait和notify实现线程在条件不满足时的等待,条件满足时的唤醒。 如何使用ReentrantLock实现wait/not
阅读全文
posted @ 2019-06-12 22:21
singleSpace
阅读(246)
推荐(0)
摘要:
1.ReentrantLock的限制 ReentrantLock保证了只有一个线程可以执行临界区代码。 临界区代码:任何时候只有1个线程可以执行的代码块。 临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其
阅读全文
posted @ 2019-06-12 20:32
singleSpace
阅读(257)
推荐(0)
摘要:
1.java.util.concurrent 线程同步: 是因为多线程读写竞争资源需要同步 Java语言提供了synchronized/wait/notify来实现同步 编写多线程同步很困难 所以Java提供了更高级的java.util.concurrent包: 更高级的同步功能 简化多线程程序的编
阅读全文
posted @ 2019-06-12 00:06
singleSpace
阅读(236)
推荐(0)
2019年6月11日
摘要:
1.多线程协调 synchronized解决了多线程竞争的问题,我们可以在synchronized块中安全的对一个变量进行修改,但是它没有解决多线程协调的问题。 例如设计一个TaskQueue,内部通过LinkedList()表示一个队列。addTask()将新任务放入队列,getTask()取出队
阅读全文
posted @ 2019-06-11 19:31
singleSpace
阅读(359)
推荐(0)