1. package com.aliyun.test.learn;
  2.  
  3. import java.util.concurrent.*;
  4. import java.util.concurrent.locks.ReentrantLock;
  5.  
  6. public class ThreadTest {
  7.  
  8. public static void main(String[] args) {
  9. System.out.println("主线程");
  10. }
  11.  
  12. private static void reenTrantLockTest() {
  13. ReentrantLock lock = new ReentrantLock();
  14.  
  15. for (int i = 0; i < 5; i++) {
  16. new Thread(() -> {
  17. lock.lock();
  18. try {
  19. Thread.sleep(3000);
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. System.out.println(Thread.currentThread().getName());
  24. lock.unlock();
  25. }, String.valueOf(i) + " ======").start();
  26. }
  27. }
  28.  
  29. private static void semaphoreTest() {
  30. Semaphore semaphore = new Semaphore(3);
  31. new Thread(() -> {
  32. try {
  33. semaphore.acquire();
  34. Thread.sleep(1000);
  35. } catch (InterruptedException e) {
  36. e.printStackTrace();
  37. }
  38. System.out.println(Thread.currentThread().getName());
  39. semaphore.release();
  40. }, "t1").start();
  41.  
  42. new Thread(() -> {
  43. try {
  44. semaphore.acquire();
  45. Thread.sleep(3000);
  46. } catch (InterruptedException e) {
  47. e.printStackTrace();
  48. }
  49. System.out.println(Thread.currentThread().getName());
  50. semaphore.release();
  51. }, "t2").start();
  52.  
  53. new Thread(() -> {
  54. try {
  55. semaphore.acquire();
  56. Thread.sleep(5000);
  57. } catch (InterruptedException e) {
  58. e.printStackTrace();
  59. }
  60. System.out.println(Thread.currentThread().getName());
  61. semaphore.release();
  62. }, "t3").start();
  63.  
  64. new Thread(() -> {
  65. try {
  66. semaphore.acquire();
  67. Thread.sleep(4000);
  68. } catch (InterruptedException e) {
  69. e.printStackTrace();
  70. }
  71. System.out.println(Thread.currentThread().getName());
  72. semaphore.release();
  73. }, "t4").start();
  74. }
  75.  
  76. private static void cyclicBarrierTest() {
  77. CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
  78. new Thread(() -> {
  79. try {
  80. cyclicBarrier.await();
  81. } catch (InterruptedException e) {
  82. e.printStackTrace();
  83. } catch (BrokenBarrierException e) {
  84. e.printStackTrace();
  85. }
  86. System.out.println(Thread.currentThread().getName());
  87. }, "t1").start();
  88.  
  89. new Thread(() -> {
  90. try {
  91. Thread.sleep(3000);
  92. System.out.println("等我");
  93. cyclicBarrier.await();
  94. } catch (InterruptedException e) {
  95. e.printStackTrace();
  96. } catch (BrokenBarrierException e) {
  97. e.printStackTrace();
  98. }
  99. System.out.println(Thread.currentThread().getName());
  100. }, "t2").start();
  101.  
  102. new Thread(() -> {
  103. try {
  104. cyclicBarrier.await();
  105. } catch (InterruptedException e) {
  106. e.printStackTrace();
  107. } catch (BrokenBarrierException e) {
  108. e.printStackTrace();
  109. }
  110. System.out.println(Thread.currentThread().getName());
  111. }, "t3").start();
  112. }
  113.  
  114. private static void threadPool() throws InterruptedException, ExecutionException {
  115. ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 2, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), Executors.defaultThreadFactory(), new ThreadPoolExecutor.DiscardPolicy());
  116. threadPoolExecutor.execute(() -> {
  117. System.out.println("hahaha");
  118. });
  119. threadPoolExecutor.shutdown();
  120.  
  121. ExecutorService executorService = Executors.newCachedThreadPool();
  122. Future<Integer> submit = executorService.submit(() -> {
  123. int a = 0;
  124. int b = a + 1;
  125. return b;
  126. });
  127. Integer o = submit.get();
  128. System.out.println(0);
  129. executorService.shutdown();
  130. }
  131.  
  132. /**
  133. * CountDownLatch
  134. * 两个线程同时运行,第三个线程等他们运行完再运行
  135. */
  136. private static void test1() {
  137. CountDownLatch latch = new CountDownLatch(2);
  138.  
  139. Thread t1 = new Thread(() -> {
  140. try {
  141. Thread.sleep(3000);
  142. } catch (InterruptedException e) {
  143. e.printStackTrace();
  144. }
  145. System.out.println(Thread.currentThread().getName());
  146. latch.countDown();
  147. }, "t1");
  148. t1.start();
  149.  
  150. Thread t2 = new Thread(() -> {
  151. try {
  152. Thread.sleep(3000);
  153. } catch (InterruptedException e) {
  154. e.printStackTrace();
  155. }
  156. System.out.println(Thread.currentThread().getName());
  157. latch.countDown();
  158. }, "t2");
  159. t2.start();
  160.  
  161. Thread t3 = new Thread(() -> {
  162. try {
  163. latch.await();
  164. System.out.println(Thread.currentThread().getName());
  165. } catch (InterruptedException e) {
  166. e.printStackTrace();
  167. }
  168. }, "t3");
  169. t3.start();
  170. }
  171. }

多线程JUC练习的更多相关文章

  1. 多线程JUC并发篇常见面试详解

    @ 目录 1.JUC 简介 2.线程和进程 3.并非与并行 4.线程的状态 5.wait/sleep的区别 6.Lock 锁(重点) 1.Lock锁 2.公平非公平: 3.ReentrantLock ...

  2. Java多线程JUC

    1. volatile 关键字 多线程访问的时候,一个比较严重的问题就是内存不可见,其实在内存访问的时候每一个线程都有一个自己的缓冲区,每次在做修改的时候都是从主存取到数据,然后放到自己的缓冲区中,在 ...

  3. java多线程----JUC集合”01之 框架

    java集合的架构.主体内容包括Collection集合和Map类:而Collection集合又可以划分为List(队列)和Set(集合). 1. List的实现类主要有: LinkedList, A ...

  4. Java多线程—JUC原子类

    根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicIn ...

  5. Java面试多线程/JUC等知识

    2021年6月30日完成此部分内容整理

  6. JUC详解

    一.Java多线程 -- JUC包源码分析1 -- CAS/乐观锁 乐观锁其实就是不加锁,用CAS + 循环重试,实现多个线程/多个客户端,并发修改数据的问题 使用AtomicStampedRefer ...

  7. Java多线程(6):锁与AQS(下)

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 之前说过,AQS(抽象队列同步器)是Java锁机制的底层实现.既然它这么优秀,是骡子是马,就拉出来溜溜吧. 首先用重入锁来实现简单的累加,就像这 ...

  8. Python爬取CSDN博客文章

    0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...

  9. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  10. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

随机推荐

  1. 打卡node day01--基础和fs内置模块

    一, 检查 node 版本 node -v 或 node --version 二,检查安装过的node 版本(nvm node 版本管理工具  安装链接 参考百度) nvm ls 三,切换node 版 ...

  2. Codensity T408 视频转码器

    Codensity T408 视频转码器   微信: orihard2014

  3. shell中;与&&的区别

    &&  后一个命令执行需要依赖前一个命令执行成功 :各个命令都会依次执行,无论成功与否

  4. WDA学习(22):WDA PLG,Application跳转传参

    1.15 WDA PLG,Application跳转传参 本实例Outbound Plugs页面跳转传参,URL跳转Application传参. 1.创建Component:Z_TEST_WDA_L6 ...

  5. pgsql给表重命名

    alter table "pavement_damage_dtl_temp" rename to "pavement_damage_dtl"; 搜索 复制

  6. 杭电oj 平方和与立方和

    给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和.   Input 输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成.   Output 对于每组输入数据,输出一 ...

  7. memoのVIM

    必须给今天看到的vim相关的东西记录一下! vim文档中文化 https://github.com/yianwillis/vimcdoc 速查表 https://github.com/skywind3 ...

  8. 从redis中取出数据并转成java对象

    1.//数据存入redis中 redisTemplate.opsForValue().set(loginame, JSON.toJSONString(users),1000,TimeUnit.SECO ...

  9. 5G工业网关在智能工厂的应用案例

    智能工厂是5G技术的重要应用场景之一.利用5G网络将生产设备无缝连接,并进一步打通设计.采购.仓储.物流等环节,使生产更加扁平化.定制化.智能化,从而构造一个面向未来的智能制造网络. 5G 作为最优的 ...

  10. node.js发送短信验证码(附带60秒倒计时插件)

    推荐一个简单且功能齐全的发送短信验证码接口1.安装下载后的SDK只包含一个zhenzisms.js文件,直接导入到工程中即可使用.下载 2.用法引入模块 const zhenzismsClient = ...