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