
多线程
文章平均质量分 91
分享多线程知识点
斗者_2013
多年java老兵,专注微服务,中间件等热点技术,分享工作心得和技术干货
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
java之yield(),sleep(),wait()区别详解-备忘笔记
1、sleep()使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高转载 2015-04-21 23:40:53 · 471 阅读 · 0 评论 -
ConcurrentHashMap使用示例
ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全的Map容器,比如Hashtable和Collections.synchronizedMap。实际上,线程安全的容器,特别是Map,应用场景没有想象中的多,很多情况下一个业务会涉及容器的多个操作,即复合操作,并发执行时,线程安全的容器只能保证自身的数据不被破坏,但无法保证业务的行为是否正确。举个例子:统转载 2016-04-05 23:33:25 · 5278 阅读 · 0 评论 -
线程的动态死锁
package com.thread.deadlock;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import javax.naming.InsufficientResourcesException;/** * 动态加锁顺序产生的死锁 * * 使用模拟转转载 2016-04-10 20:11:01 · 735 阅读 · 0 评论 -
典型的顺序死锁
package com.thread.deadlock;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * 死锁的出现分2中情况: * 1.锁顺序死锁 * 2.资源死锁 * * * 本例演示的是锁顺序死锁 * 当一个线程永远占用一个锁,而其他线原创 2016-04-10 20:21:30 · 853 阅读 · 0 评论 -
Java并发编程:Lock
Java并发编程:Lock 在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。 也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐转载 2016-04-10 21:34:39 · 417 阅读 · 0 评论 -
JAVA多线程和并发基础面试问答
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/ 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问转载 2016-04-10 21:39:27 · 399 阅读 · 0 评论 -
java并发库之Executors常用的创建ExecutorService的几个方法说明
Executors提供了一些方便创建ThreadPoolExecutor的常用方法,主要有以下几个:1、 Executors.newFixedThreadPool(int nThreads);创建固定大小(nThreads,大小不能超过int的最大值)的线程池//线程数量int nThreads = 20;//创建executor 服务ExecutorSer转载 2016-04-10 21:55:01 · 711 阅读 · 0 评论 -
几种任务调度的 Java 实现方法与比较
前言任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。本文由浅入深介绍四种任务调度的 Java 实现:TimerScheduledExecutor开源工具包 Quartz开源工具包 JCronTab此外,为结合实现复杂的任务调度,本文还将介绍 Calendar 的一些使用方法。Timer相信大家都已经非常熟悉 java转载 2016-04-10 22:08:39 · 741 阅读 · 0 评论 -
Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中转载 2016-04-10 22:18:29 · 370 阅读 · 0 评论 -
Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。 以下是本文目录大纲: 一.CountDownLatch用法 二.CyclicBarrier用法 三.Semaphore用法 若有不正之处请多多谅解,并欢迎批评指正。 请转载 2016-04-10 22:33:42 · 463 阅读 · 0 评论 -
Java 信号量 Semaphore 介绍
Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。 Sema转载 2016-04-10 15:37:36 · 496 阅读 · 0 评论 -
Java并发编程:深入剖析ThreadLocal
Java并发编程:深入剖析ThreadLocal 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。 以下是本文目录大纲: 一.对ThreadLocal的理解 二.转载 2016-04-10 14:49:26 · 383 阅读 · 0 评论 -
Java中的Runnable、Callable、Future、FutureTask的区别与示例
Java中存在Runnable、Callable、Future、FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别。Runnable其中Runnable应该是我们最熟悉的接口,它只有一个run()函数,用于将耗时操作写在其中,该函数没有返回值。然后使用某个线程去执行该runnable即可实现多线程,原创 2016-04-07 23:21:55 · 2443 阅读 · 1 评论 -
JAVA线程池shutdown和shutdownNow的区别
shutDown() 当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。 shutdownNow() 根据JDK文档描述,大致意思转载 2016-04-07 23:33:47 · 816 阅读 · 0 评论 -
线程池中CompletionService的应用
当使用ExecutorService启动了多个Callable后,每个Callable会产生一个Future,我们需要将多个Future存入一个线性表,用于之后处理数据。当然,还有更复杂的情况,有5个生产者线程,每个生产者线程都会创建任务,所有任务的Future都存放到同一个线性表中。另有一个消费者线程,从线性表中取出Future进行处理。CompletionService正是为此而存在,原创 2016-04-07 23:40:41 · 1130 阅读 · 0 评论 -
future给任务设置时限
如果一个活动无法再某个确定的时间内完成,那么它的结果就失效了,此时程序可以放弃该活动。使用future.get(timeout, unit):在结果准备好后立即返回,如果在时限内没有准备好,就会抛出TimeoutException。 如果任务超时后,future.cancel(true)取消任务。小案例:在预期时间加载广告页面package com.thread;imp原创 2016-04-08 15:32:25 · 6764 阅读 · 0 评论 -
任务的批量提交invokeAll两种方法的区别
ExecutorService的invokeAll方法有两种用法:1.exec.invokeAll(tasks)2.exec.invokeAll(tasks, timeout, unit)其中tasks是任务集合,timeout是超时时间,unit是时间单位两者都会堵塞,必须等待所有的任务执行完成后统一返回,一方面内存持有的时间长;另一方面响应性也有一定的影响,毕竟大家都喜欢看看刷原创 2016-04-08 18:34:36 · 32999 阅读 · 2 评论 -
ExecutorService.invokeAny()和ExecutorService.invokeAll()的使用剖析
原文:http://blog.youkuaiyun.com/aitangyong/article/details/38172189ExecutorService是JDK并发工具包提供的一个核心接口,相当于一个线程池,提供执行任务和管理生命周期的方法。ExecutorService接口中的大部分API都是比较容易上手使用的,本文主要介绍下invokeAll和invokeAll方法的特性和使用。我们先提供转载 2016-04-08 18:42:54 · 2834 阅读 · 0 评论 -
线程饥饿死锁
线程饥饿死锁: 在一个线程池中,如果一个任务依赖于其他任务的执行,就可能产生死锁。对应一个单线程话的Executor,一个任务将另一个任务提交到相同的Executor中,并等待新提交的任务的结果,这总会引发死锁。第二个任务滞留在工作队列中,直到第一个任务完成,但是第一个任务不会完成,因为它在等待第二个任务的完成。 同样在一个大的线程池中,如果所有线程执行的任务原创 2016-04-10 09:39:01 · 7514 阅读 · 2 评论 -
线程的取消和中断
下面介绍取消线程常用的4中方式:一、通过设置“cancelled requested”标志来中断线程java中的任务取消实现: 是通过一个协作机制完成的,使用一个线程能够要求另一个线程停止当前的工作。 这样做的原因是: 如果直接要求一个任务、线程或者服务立即停止,可能会导致共享的数据结构处于不一致的状态。 当要求他们停止时,他们首先会清除当前进程中的工原创 2016-04-10 10:46:27 · 966 阅读 · 0 评论 -
阻塞队列中的安全中断
本文的小例子主要是说明如何安全中断阻塞队列中的任务,避免使用interrupt()中断线程,造成堵塞队列中没有被消费的任务都被忽略。package com.thread;import java.io.PrintWriter;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.Blockin原创 2016-04-10 12:15:01 · 1838 阅读 · 0 评论 -
Java中的Atomic包使用指南
引言Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作。原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞。Atomic包介绍在Atomic包里一共有12个类,四种原子更新方式,分别是原转载 2016-04-10 23:00:32 · 525 阅读 · 0 评论