IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JUC整理(二) -> 正文阅读

[Java知识库]JUC整理(二)

Callable

  1. 可以有返回值
  2. 可以抛出异常
  3. 方法不同 为 call() 方法

callable 的使用

public class CallableTest implements Callable<String> {
    @Override
    public String call() throws Exception {
        return null;
    }
}
class Test00{
    public static void main(String[] args) {
        CallableTest callableTest = new CallableTest();
        FutureTask futureTask = new FutureTask(callableTest);
        new Thread(futureTask).start();
        String str = (String) futureTask.get();//get 方法可能会有阻塞产生
        System.out.println(str);
    }
}

常用辅助类

CountDownLatch

  • countDownLatch.await();//等待归零后再向下执行
  • countDownLatch.countDown();//–操作
public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        //总数是6倒计时
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i=0;i<6;i++){
            new Thread(()->{
                System.out.println(Thread.currentThread().getName());
                //--操作
                countDownLatch.countDown();
            },String.valueOf(i)).start();
        }
        //计数器归零后再向下运行
        countDownLatch.await();
        System.out.println(countDownLatch.toString());
        System.out.println(1111);
    }
}

CyclicBarrier

  • cyclicBarrier.await(); //等待直到到达new对象时的数字
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
            System.out.println("到达7");
        });
        for(int i=0;i<7;i++){
            final int temp = i;
            new Thread(()->{
                System.out.println("嗨害嗨"+temp+Thread.currentThread().getName());
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },String.valueOf(i)).start();
        }
    }
}

Semaphore

  • semaphore.acquire(); //获取 如果满了等待被释放为止
  • semaphore.release(); //释放 释放一个线程数

多个共享资源互斥的使用, 并发限流控制最大的线程数

public class SemaphoreDemo {
    public static void main(String[] args) {
        //参数为线程数量
        Semaphore semaphore = new Semaphore(3);
        for(int i =0;i<10;i++){
            new Thread(()->{
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"到达");
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName()+"离开");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    semaphore.release();
                }
            },String.valueOf(i)).start();
        }

    }
}

读写锁 ReadWriteLock

  • 读写锁分为读锁和写锁 在写锁时其他写入线程被阻塞
  • 读锁 在读取时其他线程可以同时进行读取

public class ReadWriteLockDemo {
    public static void main(String[] args) {
        ReadWriteLockTest readWriteLockTest = new ReadWriteLockTest();
        for (int i = 0; i < 10; i++) {
            final int temp = i;
            new Thread(()->{
                readWriteLockTest.put(temp+" ",temp+"");
            },String.valueOf(i)).start();
        }
        for (int i = 0; i < 10; i++) {
            final int temp = i;
            new Thread(()->{
                readWriteLockTest.get(temp+" ");
            },String.valueOf(i)).start();
        }
    }

}
class ReadWriteLockTest{
    private HashMap<String,String> map = new HashMap<>();
    private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    public void put(String key,String val){

        readWriteLock.writeLock().lock();
        System.out.println("写入"+key);
        map.put(key,val);
        System.out.println("写入"+key+"成功");
        readWriteLock.writeLock().unlock();
    }
    public void get(String key){
        readWriteLock.readLock().lock();
        map.get(key);
        System.out.println("读取成功"+key);
        readWriteLock.readLock().unlock();
    }
}


  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:17:51  更:2022-03-10 22:20:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:12:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码