Java高并发编程详解学习笔记(三)

前言:要秋招了,复习一下应对秋招,纠结该先看啥,最后决定先学习《Java高并发编程详解》,此博客为看书所写的笔记,因为是笔记,所以会只记比较重要的东西,不适合初学者。这里本人经过前面的学习,了解了一些高并发编程的知识了,打算针对几个难点敲点代码加深一下理解。

目录

第一章 interrupt

第二章 wait与notify

2.1 单线程通信

2.2 多线程通信

第三章 自定义显示锁BooleanLock

3.1 synchronized关键字的缺陷

3.2 自定义显示锁

第三章 自定义线程池

3.1 新建

3.2 维护

3.3 销毁


第一章 interrupt

当线程进入阻塞状态时,另一个线程调用被阻塞线程的interrupt()方法,将会使被阻塞线程中断阻塞,一个线程在阻塞的情况下被打断会抛出异常。

可以看到,线程被打断并抛出异常后,继续执行。

public class Interrupt {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            System.out.println("嘿嘿嘿");
            try {
                TimeUnit.MINUTES.sleep(1);
            } catch (InterruptedException e) {
                System.out.println("抛出异常");
                e.printStackTrace();
            }
            System.out.println("嘿嘿嘿");
        });
        thread.start();
        try {
            TimeUnit.MILLISECONDS.sleep(2);
            thread.interrupt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

 

第二章 wait与notify

考虑这样一个场景,客服端请求不断到服务器,服务器接收到请求后,新建线程来处理请求然后返回结果给客户端。

这样不断新建销毁线程消耗较大,可以切换为异步非阻塞模式,客户端的请求在一个队列中,服务器的几个线程不断地从队列中取出请求进行处理,将结果保存到结果集中,返回客户端一个凭证,客户端凭借凭证来取数据。

这样出现一个问题就是,怎么知道队列中是否有请求,如果每隔一段时间轮询的话就比较麻烦,可以使用wait与notify来解决这个问题。

2.1 单线程通信

注意:必须在同步方法中使用wait和notify方法,且同步代码的monitor必须与执行wait与notify()的对象一致。

//任务队列
public class EventQueue {
    private final int max;

    static class Event{

    }
    public static void main(String[] args) {

    }
    private final LinkedList<Event> eventQueue  = new LinkedList<>();

    public EventQueue(){
        this(10);
    }

    public EventQueue(int max){
        this.max=max;
    }

    public void offer(Event event){
        synchronized (eventQueue){
            if(eventQueue.size()==max){
                try {
                    System.out.println("the queue is full");
                    eventQueue.wait();
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值