Java多线程
.
Forest24
keep learning...
展开
-
线程池
分两种: 1.ThreadPoolExecutor 2.ForkJoinPool 分解汇总 ThreadPool线程池,维护着两个集合:线程集合,任务队列 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,4, 60,TimeUnit.SECONDS, ...原创 2019-10-19 13:26:28 · 154 阅读 · 0 评论 -
FutureTask相当于Future和Runable的结合
FutureTask相当于Future和Runable的结合,既可以作为一个任务task,并且执行结果还存在FutureTask里 public static void main(String[] args) throws ExecutionException, InterruptedException { //FutureTask相当于Future和Runable的结合,...原创 2019-10-19 11:57:27 · 164 阅读 · 0 评论 -
Callable,Future使用demo
Callable = Runable + return Future :存储执行的将来才会产生的结果 public static void main(String[] args) throws ExecutionException, InterruptedException { Callable<String> callable = new Callable<...原创 2019-10-19 11:40:33 · 144 阅读 · 1 评论 -
最简单的模拟死锁程序
假设线程1在执行过程中需要锁定对象1,在锁定对象1的过程中还要锁定对象2。 而线程2在执行过程中需要锁定对象2,在锁定对象2的过程中还要锁定对象1。 如果线程1先锁定了对象1,线程2锁定了对象2。当线程1去申请对象2的锁的时候, 是申请不到的,而线程2此时去申请对象1的锁时,因为已经被线程1锁定,故也无法申请到。 此时两个线程都无法进行下去,故死锁。 package com.examp...原创 2019-04-17 11:23:30 · 751 阅读 · 0 评论 -
volatile关键字的作用
保证两个线程之间变量的可见性, 如果一个线程修改了某个变量, 另一个线程可以读到修改后的变量。 如:一个线程从主内存中读取某个变量到自己占用的cpu的缓冲区或内存, 然后对该变量进行操作,操作完之后再写入主内存, 过程中如果其他线程修改了此变量,其他已读取该变量的线程是不知道的。 加了volatile关键字后,如果变量被修改,会通知其他线程他们缓存的变量已经被修...原创 2019-04-17 14:46:14 · 155 阅读 · 0 评论 -
浅谈synchronized关键字和ReenTrantLock可重入锁
ReenTrantLock单单字面意思就可以理解是可重入的锁,其实synchronized关键字所使用的锁也是可重入的,这方面区别不大。两者都是同一个线程每进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。 看一个例子: 本例中由于m1锁定this,只有m1执行完毕后,m2才能执行。这里是复习synchronized最原始的语义 package com.example...原创 2019-04-18 15:52:52 · 311 阅读 · 0 评论 -
juc下locks之LockSupport
public static void main(String[] args) { Thread t = new Thread(()->{ for (int i = 0; i < 10; i++) { System.out.println(i); if (i == 3){ ...原创 2019-09-27 15:14:37 · 122 阅读 · 0 评论