同步阻塞? 同步非阻塞?异步阻塞?.................................
搞的好乱~~~,问题一堆,总是记不清,整理下
同步异步 与 阻塞非阻塞 其实是两部分,分开看;这样就不会乱了
首先 同步异步,说的是调用方是否及时收到被调用方的反馈, 如果调用方立即收到了被调用方的消息,那么就是同步的;
如果是被调用方很久之后通知调用方,那么就是异步;
例如: 我给114打电话查询 报警电话是多少? 114回复我是110; 这就是同步; (或者直接跟我说,我不懒着给你查询,我不知道)
例如: 我给114打电话查询 报警电话是多少?114 回复我,你等下哈,然后我把电话挂了,过了一会儿 114给我打电话通知我,报警电话是110,这就是异步;
同步异步说的是,线程之间的通信机制,异步是被调用方主动推送消息给调用方;同步是立即会得到一个结果;
阻塞与非阻塞 说的是,调用方等待被调用方的反馈信息时候的状态,关注点在于反馈结果的过程中调用方做了什么;
例如: 我给114打电话查询 报警电话是多少? 114回复我,我去查询等我下;(挂不挂电话都行)
然后呢,我有两种做法
1 我啥也不干,就在这等着114给我回馈消息; 这就是阻塞
2 我手机开启扬声器,我开一瓶雪花倒了一杯,喝了一口,然后听到了手机中114回复我,报警电话是110; 这就是非则塞
线程的六种状态
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
1 new 尚未启动,仅仅是new 了一个Thread实例,未调用start方法;
2 就绪状态 runnable 调用start方法之后;
3 blocked 阻塞状态, 等待锁的时候,既有多个线程枪锁,抢锁等待,等待锁释放 ;
4 time_waiting 等待超时,这个状态会在一段时间之后自动唤醒,不需要其他线程,该时间可以控制,通常进入这个状态,可以通过调用 sleep(time),wait(time), join(time), 与waiting 很像;
5 waiting 等待状态,处于等待状态,进入这个状态通常需要调用方法: wait(), join() 等,且此状态需要其他线程唤醒,一般唤醒方法有: notify(),notifyall(),否则不会再次恢复到 runnable状态;
6 TERMINATED 结束状态,线程已经执行完毕,或者被中断
线程通信(两个线程之间交互信息)
/**
* @author fulin
*/
public class 线程交换信息 {
@SneakyThrows
public static void main(String[] args) {
Exchanger<String> stringExchanger = new Exchanger<>();
Thread thread = new Thread(() -> {
System.out.println(Thread.currentThread().getName());
try {
System.out.println(Thread.currentThread().getName() + "我接受到了消息: " + stringExchanger.exchange("你好"));
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
thread.setName("第一个");
thread.start();
Thread.sleep(2000);
Thread thread1 = new Thread(() -> {
System.out.println(Thread.currentThread().getName());
try {
System.out.println(Thread.currentThread().getName() + "我接受到了消息: " + stringExchanger.exchange("hello"));
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
thread1.setName("第二个");
thread1.start();
}
}
线程计数(只有全部交卷才算考试结束)
/**
* @author fulin
* @since 2023/5/8 10:30
*/
public class 多线程计数器 {
@SneakyThrows
public static void main(String[] args) {
System.out.println("开始考试");
CountDownLatch countDownLatch = new CountDownLatch(10);
ExecutorService service = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
int finalI = i;
service.execute(() -> {
System.out.println("第" + finalI + 1 + "个考生交卷");
countDownLatch.countDown();
});
}
countDownLatch.await();
System.out.println("考试完毕");
service.shutdown();
}
}
本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。