多线程JUC练习
package com.aliyun.test.learn; import java.util.concurrent.*;
import java.util.concurrent.locks.ReentrantLock; public class ThreadTest { public static void main(String[] args) {
System.out.println("主线程");
} private static void reenTrantLockTest() {
ReentrantLock lock = new ReentrantLock(); for (int i = 0; i < 5; i++) {
new Thread(() -> {
lock.lock();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
lock.unlock();
}, String.valueOf(i) + " ======").start();
}
} private static void semaphoreTest() {
Semaphore semaphore = new Semaphore(3);
new Thread(() -> {
try {
semaphore.acquire();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
semaphore.release();
}, "t1").start(); new Thread(() -> {
try {
semaphore.acquire();
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
semaphore.release();
}, "t2").start(); new Thread(() -> {
try {
semaphore.acquire();
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
semaphore.release();
}, "t3").start(); new Thread(() -> {
try {
semaphore.acquire();
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
semaphore.release();
}, "t4").start();
} private static void cyclicBarrierTest() {
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
new Thread(() -> {
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}, "t1").start(); new Thread(() -> {
try {
Thread.sleep(3000);
System.out.println("等我");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}, "t2").start(); new Thread(() -> {
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}, "t3").start();
} private static void threadPool() throws InterruptedException, ExecutionException {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 2, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), Executors.defaultThreadFactory(), new ThreadPoolExecutor.DiscardPolicy());
threadPoolExecutor.execute(() -> {
System.out.println("hahaha");
});
threadPoolExecutor.shutdown(); ExecutorService executorService = Executors.newCachedThreadPool();
Future<Integer> submit = executorService.submit(() -> {
int a = 0;
int b = a + 1;
return b;
});
Integer o = submit.get();
System.out.println(0);
executorService.shutdown();
} /**
* CountDownLatch
* 两个线程同时运行,第三个线程等他们运行完再运行
*/
private static void test1() {
CountDownLatch latch = new CountDownLatch(2); Thread t1 = new Thread(() -> {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
latch.countDown();
}, "t1");
t1.start(); Thread t2 = new Thread(() -> {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
latch.countDown();
}, "t2");
t2.start(); Thread t3 = new Thread(() -> {
try {
latch.await();
System.out.println(Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "t3");
t3.start();
}
}
多线程JUC练习的更多相关文章
- 多线程JUC并发篇常见面试详解
@ 目录 1.JUC 简介 2.线程和进程 3.并非与并行 4.线程的状态 5.wait/sleep的区别 6.Lock 锁(重点) 1.Lock锁 2.公平非公平: 3.ReentrantLock ...
- Java多线程JUC
1. volatile 关键字 多线程访问的时候,一个比较严重的问题就是内存不可见,其实在内存访问的时候每一个线程都有一个自己的缓冲区,每次在做修改的时候都是从主存取到数据,然后放到自己的缓冲区中,在 ...
- java多线程----JUC集合”01之 框架
java集合的架构.主体内容包括Collection集合和Map类:而Collection集合又可以划分为List(队列)和Set(集合). 1. List的实现类主要有: LinkedList, A ...
- Java多线程—JUC原子类
根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicIn ...
- Java面试多线程/JUC等知识
2021年6月30日完成此部分内容整理
- JUC详解
一.Java多线程 -- JUC包源码分析1 -- CAS/乐观锁 乐观锁其实就是不加锁,用CAS + 循环重试,实现多个线程/多个客户端,并发修改数据的问题 使用AtomicStampedRefer ...
- Java多线程(6):锁与AQS(下)
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 之前说过,AQS(抽象队列同步器)是Java锁机制的底层实现.既然它这么优秀,是骡子是马,就拉出来溜溜吧. 首先用重入锁来实现简单的累加,就像这 ...
- Python爬取CSDN博客文章
0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...
- Java多线程系列--“JUC锁”03之 公平锁(一)
概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...
- Java多线程系列--“JUC锁”04之 公平锁(二)
概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...
随机推荐
- c语言学习---void 数据类型
这样的语法是错误的: void a = 10; void表示无类型, 这样定义一个变量a, 编译器是无法知道给a分配多大的内存空间的 #include<stdio.h> #include ...
- Tomcat 的连接数与线程池
一.背景 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 Tomcat配置文件server.xm ...
- 运筹学之线性规划 1.X
线性规划 线性规划问题的标准形式可以写成: \[\begin{aligned} &max~z=\pmb{c}^T\pmb{X} \\ &s.t.\{ \begin{aligned} & ...
- 基础篇之Markdown基础语法
标题 1. # + 空格 + 标题名字 → 一级标题 2. ## + 空格 + 标题名字 → 二级标题 3. ### + 空格 + 标题名字 → 三级标题 ...... 6.###### + 空格 + ...
- ios自动化测试学习
原文:https://blog.csdn.net/jinjiangongzuoshi/article/details/126552806 内测发布工具 fir.im 为开发者提供测试应用极速发布,应用 ...
- ThinkPHP3.2设置异常页面404跳转
在ThinkPHP3.2版本中当我们访问不存在的页面时会出现非常不友好错误提示页面. 解决办法: 1.在ThinkPHP3.2详细的介绍了该框架下的ThinkPHP惯例配置文件convention.p ...
- 那些年vue踩过的坑v-if渲染完dom重新渲染 获取dom问题
当查询完成是 加载chart图了, 因为 上面的 div 是v-if 还没来得级渲染 所以获取下面chart div 时 没有dom元素 报错了
- 启动Apache出现错误Port 80 in use by "Unable to open process" with PID 4!
22:15:30 [Apache] Problem detected! 22:15:30 [Apache] Port 80 in use by "Unable to open proce ...
- Oracle 用户创建,权限授予
https://blog.csdn.net/zhao05164313/article/details/124172838 grant create any view to crjp; 被授予权限的用户 ...
- ufw-防火墙添加22端口
sudo ufw allow ssh/tcp 或 ufw allow 22/tcp 添加拒绝规则也是同样的招数.我们假设你想拒绝 ftp 访问, 你只需输入 sudo ufw deny ftp