![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java多线程
「已注销」
不只聊技术
展开
-
线程池
一、线程池的构造使用线程池离不开ThreadPoolExecutor类,该类实现了ExecutorService接口,其构造方法如下:public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,Thre原创 2018-01-07 01:57:22 · 163 阅读 · 0 评论 -
创建线程的三种方法
方法一:继承Thread类 方法二:实现Runnable接口 方法三:实现Callable接口前两种方法需要重写run方法,第三种方法需要重写call方法。因为Java不允许多继承,允许实现多个接口,所以方法二比方法一灵活。方法三与方法二类似,但可以获得返回值,功能更强大。用Callable对象实例化一个FutureTask对象,FutureTask对象既可以像Runnable对象那样用来实例化原创 2018-01-06 16:59:32 · 234 阅读 · 0 评论 -
阻塞队列
对于多线程间的数据共享,可以使用阻塞队列(BlockingQueue)来实现,它为我们自动管理多线程环境下的等待与唤醒问题,让程序员可以忽略这些细节,专注于高层次的业务功能。会抛出异常的方法: add(添加一个元素)、element(返回队列的头元素)、remove(移出并返回头元素) 会阻塞的方法: put(添加一个元素)、take(移出并返回头元素) 不抛出异常不阻塞只改变返回值的方法:原创 2018-01-05 23:36:20 · 158 阅读 · 0 评论 -
读/写锁
如果有很多线程同时读取数据而只有很少线程写入数据,那么允许读者线程共享访问,对性能有很大提升,在此情况下使用读/写锁。读锁可以被多个读操作共用,但排斥所有写操作;写锁排斥所有其他的读操作和写操作。private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();private Lock readLock = rwl.readLock(原创 2018-01-05 21:37:31 · 208 阅读 · 0 评论 -
锁测试与超时
先来比较一下Lock的四个锁方法:1.void lock() 在等待获取锁的过程中休眠,禁止一切线程调度2.void lockInterruptibly() throws InterruptedException 在等待获取锁的过程中可以被中断,被中断后抛出异常3.boolean tryLock() 获取到锁返回true,获取不到锁返回false,不会等待4.boolean tryLock(l原创 2018-01-05 21:27:05 · 488 阅读 · 0 评论 -
final关键字
final关键字通常被用来修饰不希望被修改的变量,在多线程环境中,它通过保证指令有序性起作用,即如果一个对象在初始化期间有可能被其他线程访问,那么就是不安全的,final关键字防止了指令重排,保证对象创建完成之后才会被其他线程调用。也可以这么理解,对于那些不被修改的变量,它们天生就是线程安全的,但唯一会出现问题的点就是在对象初始化的过程中它们被其他线程访问到。用final关键字修饰这些变量,就彻底保原创 2017-12-30 00:48:01 · 200 阅读 · 0 评论 -
volatile关键字
volatile关键字是一种比synchronized更轻量级的同步方法,它提供了一种免锁机制。与synchronized相比,volatile可以保证可见性、有序性,但不能保证原子性,所以只有在一些对原子性没有要求的场合才可以用volatile代替synchronized。可见性:普通情况下线程读数据时把数据从内存读到自己的缓存区,以后可能会直接从缓存区读取,而不经过内存,写数据时也是先写入缓存区原创 2017-12-30 00:31:19 · 133 阅读 · 0 评论 -
线程同步
1.锁对象 用ReentrantLock(可重入锁)类可以声明一个锁对象,一般情况下它和synchronized(锁对象){}的用法相似,但它有更多高级功能,暂时不做讨论,使用方式如下:ReentrantLock lock = new ReentrantLock(); lock.lock(); try { ... } finally { lock.unlock(); }2.条件对象原创 2017-12-29 00:10:02 · 129 阅读 · 0 评论 -
守护线程
守护线程(daemon thread)只是用来为其他线程提供服务,例如垃圾处理线程,当所有其他线程都终止只剩下守护线程时,虚拟机就退出了。不要让守护线程去访问固有资源,如文件、数据库,因为它可能在任何时候中断,不安全。可以用setDaemon(true)方法把一个线程设置为守护线程。下面是使用守护者线程的一个例子: 两个线程,一个为写日志线程,一个为清理日志线程,我们把后者设置为守护线程,这样当前原创 2017-12-28 22:40:01 · 497 阅读 · 0 评论 -
ThreadLocal
synchronized和ThreadLocal都是应用于线程共享变量时的方法,但它们对应的应用场景不同。我们可以这样理解,多个线程共享同一个对象的变量,当多个线程需要维护的是同一个变量值时(即同一个时刻该变量一定只有唯一值是正确的),则用synchronized进行同步;然而当多个线程需要维护的不是同一个变量值时,它们只需要获取该变量的初始值,该变量在每个线程中的值都是独立的、无关的,则用Thre原创 2018-01-03 21:37:50 · 192 阅读 · 0 评论 -
线程阻塞
广义上的线程阻塞又可以细分为阻塞和等待两种:阻塞指线程试图获取的对象锁被其他线程持有导致线程被阻塞,此过程发生在synchronized代码块之外,是被动的。等待指线程通过调用wait或sleep方法进入等待状态,此过程发生在synchronized代码块之内,是主动的。前者释放了锁,需要另外一个线程在持有同一个对象锁的同步代码块之内调用notify方法唤醒等待线程;后者没有释放锁,在计时结束后自动原创 2017-12-28 00:29:49 · 269 阅读 · 0 评论 -
线程中断
调用Thread对象的stop方法可以强制终止线程,但这种方法只是简单粗暴地终止线程,线程可能存在未做完的工作和未释放的资源,是一种不安全的方法,所以已经被弃用。正确的终止线程的方法是设置flag标志,在run方法中用while循环不断检查flag,而在需要终止线程的地方修改flag,这样就能让线程在本次while循环中完成任务,在下一次while循环判断时被终止,这种方法是安全的。但要注意,线程被原创 2017-12-28 00:14:40 · 236 阅读 · 0 评论 -
同步器
线程之间相互合作时,需要用到同步器来完成同步,下面介绍几种常用同步器:1.Semaphore(信号量) 信号量数量限制了访问资源的线程总数,线程请求会消耗一个信号量,当信号量为0时,新的线程会阻塞,直到有线程释放了一个信号量线程类:package Semaphore;import java.util.concurrent.Semaphore;public class SemaphoreThread原创 2018-01-07 16:33:17 · 838 阅读 · 0 评论