线程之间的通信 状态

75 阅读3分钟

同步阻塞? 同步非阻塞?异步阻塞?.................................

搞的好乱~~~,问题一堆,总是记不清,整理下

同步异步 与 阻塞非阻塞 其实是两部分,分开看;这样就不会乱了

首先 同步异步,说的是调用方是否及时收到被调用方的反馈, 如果调用方立即收到了被调用方的消息,那么就是同步的; 如果是被调用方很久之后通知调用方,那么就是异步;
例如: 我给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…,如有侵权,请联系删除。