Java线程等待唤醒机制

作者: Thomas__Yang | 来源:发表于2017-10-17 16:54 被阅读182次

记录面试过程中被问到的几个需要手写代码的小案例

1.请手写出线程的等待唤醒机制

案例中两个线程:SyncSetThread设置学生信息,SyncGetThread用来获取学生信息,在Student实体中提供一个标记属性flag,记录当前是否有数据。


等待唤醒机制
  • 设置信息线程SyncSetThread
/*
 * 使用Object的wait() 和 notify() 来实现等待唤醒机制
 * Created by JackYang on 2017/10/17.
 */

class SyncSetThread implements Runnable {

    private final Student student;

    SyncSetThread(Student student) {
        this.student = student;
    }

    @Override
    public void run() {
        int num = 0;
        while (true) {
            synchronized (student) {
                if (student.flag) {
                    try {
                        student.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                if (num % 2 == 0) {
                    student.name = "JackYang";
                    student.age = 26;
                } else {
                    student.name = "江一燕";
                    student.age = 28;
                }
                ++num;
                student.flag = true;
                student.notify();
                //此时唤醒,SyncSetThread和SyncGetThread两个线程都有同等的机会去抢占资源
            }
        }
    }
}
  • 获取信息线程SyncGetThread
class SyncGetThread implements Runnable {

    private final Student student;

    SyncGetThread(Student student) {
        this.student = student;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (student) {

                if (!student.flag) {
                    try {
                        //对象中没有数据的时候就等待
                        student.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                System.out.println(student.name + "---" + student.age);
                //数据消费完了(取出后)改变标记
                student.flag = false;
                student.notify();
                //此时唤醒,SyncSetThread和SyncGetThread两个线程都有同等的机会去抢占资源
            }
        }
    }
}
  • 测试入口
/*
 * 线程的等待唤醒机制,实现一人一次有规律
 * Created by JackYang on 2017/10/17.
 */

public class TestSyncThread {
    public static void main(String[] args) {

        Student student = new Student();

        SyncSetThread syncSetThread = new SyncSetThread(student);
        SyncGetThread syncGetThread = new SyncGetThread(student);

        Thread thread1 = new Thread(syncSetThread);
        Thread thread2 = new Thread(syncGetThread);

        thread1.start();
        thread2.start();
    }
}

2.请手写出线程死锁代码

这个没得商量,直接上代码

/**
 * 死锁代码
 * Created by JackYang on 2017/10/17.
 */

class DieThread extends Thread {

    private boolean flag;

    DieThread(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {

        if (flag) {
            //防止一次卡不住
            while (true) {
                synchronized (MyLock.lockA) {
                    System.out.println("true lockA");
                    synchronized (MyLock.lockB) {
                        System.out.println("true lockB");
                    }
                }
            }

        } else {

            while (true) {
                synchronized (MyLock.lockB) {
                    System.out.println("false lockB");
                    synchronized (MyLock.lockA) {
                        System.out.println("false lockA");
                    }
                }
            }
        }
    }
}

相关文章

  • Java线程等待唤醒机制

    前言 今天看源码的时候遇到这样一个场景,某线程里面的逻辑需要等待异步处理结果返回后才能继续执行。或者说想要把一个异...

  • Java线程等待唤醒机制

    记录面试过程中被问到的几个需要手写代码的小案例 1.请手写出线程的等待唤醒机制 案例中两个线程:SyncSetTh...

  • JavaSE第19篇:多线程下篇

    核心概述:本篇我们将继续学习Java中的多线程,其中有多线程的等待唤醒机制、Condition接口的使用、Java...

  • 线程间通信

    线程间通信 等待唤醒机制 等待唤醒机制就是用于解决线程间通信的问题的,使用到的3个方法的含义如下:wait():告...

  • 7.线程池、Lambda表达式

    主要内容 等待与唤醒案例 线程池 Lambda表达式 第一章 等待唤醒机制 1.1 线程间通信 概念:多个线程在处...

  • 线程间通信

    1 Java经典的等待/通知机制 在java中的等待通知机制就是,一个线程让其他线程从wait方法返回。前提:wa...

  • 5.线程间通信,等待唤醒机制

    线程间通信 等待唤醒机制 wati():让线程处于冻结状态。被wati的线程会被放入线程池中 notify():唤...

  • Java 多线程 线程间通信-等待唤醒机制

    线程间通讯:其实就是多个线程在操作同一个资源,但是操作的动作不同。 wait();notify();notifyA...

  • 2020-06-28---线程通讯

    1.等待唤醒机制 2.一个线程等待所有其他线程执行完毕之后再执行 3.一组线程准备完毕之后同时启动

  • 6.AQS(抽象同步帮助器)

    加锁的本质是什么?加锁的本质是为了在多线程情况下串行的访问临界资源。 一、JAVA中的等待唤醒机制 1.1 基于m...

网友评论

    本文标题:Java线程等待唤醒机制

    本文链接:https://www.haomeiwen.com/subject/gabduxtx.html