• 【23】线程相关扩展习题


    目录

    习题一

    习题二

    习题三


    习题一

    /**
     * 银行有一个账户
     * 有两个储户分别向同一个账户存3000元,每次存1000,存三次,每次存完打印账户余额
     *
     * 分析:
     * 1、两个储户线程
     * 2、是否有共享数据:账户,余额
     * 3、是否有线程安全问题
     * 4、需要考虑线程安全问题:同步机制:三种方式
     *
    */
    1. class Account{
    2. private double balance;
    3. private ReentrantLock lock = new ReentrantLock();
    4. public Account(double balance){
    5. this.balance=balance;
    6. }
    7. // 存钱的方法一
    8. // public synchronized void deposit(double amt){
    9. public void deposit(double amt){
    10. // 方法二
    11. lock.lock();
    12. try {
    13. if (amt > 0) {
    14. balance += amt;
    15. try {
    16. Thread.sleep(1000);
    17. } catch (InterruptedException e) {
    18. e.printStackTrace();
    19. }
    20. System.out.println(Thread.currentThread().getName() + "存钱成功,余额:" + balance);
    21. }
    22. }finally {
    23. lock.unlock();
    24. }
    25. }
    26. }
    27. class Customer extends Thread{
    28. private Account acc;
    29. public Customer(Account acc){
    30. this.acc=acc;
    31. }
    32. @Override
    33. public void run() {
    34. for (int i=0;i<3;i++){
    35. acc.deposit(1000);
    36. }
    37. }
    38. }
    39. public class AccounTest {
    40. public static void main(String[] args) {
    41. Account acc=new Account(0);
    42. Customer c1=new Customer(acc);
    43. Customer c2=new Customer(acc);
    44. c1.setName("甲");
    45. c2.setName("乙");
    46. c1.start();
    47. c2.start();
    48. }
    49. }

    习题二

    /**
     * 线程通信的例子:使用两个线程打印1-100,线程1、2交替打印
     * 涉及到的三个方法:
     * wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器
     * notify():一旦执行此方法,就会唤醒被wait()的一个进程,如果有多个线程被wait,就唤醒优先级最高的
     * notifyAll():一旦执行此方法,就会唤醒所有被wait的线程。
     *
     * 说明:
     * 1、wait(),notify(),notifyAll()三个方法必须使用在同步代码块中或同步方法中
     * 2、wait(),notify(),notifyAll()三个方法调用者必须是同步代码块或同步方法中的同步监视器,
     *      否则,会出现IllegaLmontiorStateException异常
     * 3、wait(),notify(),notifyAll()三个方法是定义在java.long.Object类中。
     *
     * 面试题:sleep()和wait()的异同
     * 1、相同点:一旦执行方法,都可以使得当前线程进入堵塞状态
     * 2、不同点:(1)两个方法声明的位置不同:Thread类中声明sleep(),Object类中声明wait()
     *          (2)调用的要求不同,sleep()可以在任何需要的场景下调用。wait()必须使用子啊同步代码块中或同步方法中
     *          (3)关于是否释放同步监视器,如果两个方法都是用在同步代码块或同步方法中中,sleep()不会释放锁,wait()会释放锁
     *
    */
    1. class Number implements Runnable{
    2. private int num=1;
    3. private ReentrantLock lock =new ReentrantLock();
    4. @Override
    5. public void run() {
    6. while (true){
    7. // lock.lock();
    8. // try {
    9. synchronized (this) {
    10. notify();
    11. if (num <= 100) {
    12. System.out.println(Thread.currentThread().getName() + ":" + num);
    13. num++;
    14. try {
    15. // 使得调用如下wait()方法的进程进入堵塞状态
    16. wait();
    17. } catch (InterruptedException e) {
    18. e.printStackTrace();
    19. }
    20. } else {
    21. break;
    22. }
    23. }
    24. }
    25. }
    26. }
    27. public class CommunicationTest {
    28. public static void main(String[] args) {
    29. Number number=new Number();
    30. Thread t1=new Thread(number);
    31. Thread t2=new Thread(number);
    32. t1.setName("线程一");
    33. t2.setName("线程二");
    34. t1.start();
    35. t2.start();
    36. }
    37. }

    习题三

    /**
     * 线程通信的应用:经典例题:生产者/消费者问题
     *
     * 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处
     * 取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图
     * 生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通
     * 知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如
     * 果店中有产品了再通知消费者来取走产品。
     *
     * 分析:
     * 1、是否是多线程:生产者,消费者
     * 2、是否有共享数据:店员/产品
     * 3、如何来来解决线程的安全问题:同步机制,有三种方法
     * 4、是否涉及到线程的通信:
     *
     *
    */
    1. class Clerk{
    2. private int productCont=0;
    3. // 生产
    4. // synchronized不要忘了加
    5. public synchronized void produceProduct() {
    6. if(productCont<20){
    7. productCont++;
    8. System.out.println(Thread.currentThread().getName()+":开始生产第"+productCont+"个产品");
    9. notify();
    10. }else {
    11. try {
    12. wait();
    13. } catch (InterruptedException e) {
    14. e.printStackTrace();
    15. }
    16. }
    17. }
    18. // 消费
    19. public synchronized void consumeProduct() {
    20. if(productCont>0){
    21. System.out.println(Thread.currentThread().getName()+":开始消费第"+productCont+"个产品");
    22. productCont--;
    23. notify();
    24. }else {
    25. try {
    26. wait();
    27. } catch (InterruptedException e) {
    28. e.printStackTrace();
    29. }
    30. }
    31. }
    32. }
    33. //生产者
    34. class Producer extends Thread{
    35. private Clerk clerk;
    36. public Producer(Clerk clerk){
    37. this.clerk=clerk;
    38. }
    39. @Override
    40. public synchronized void run() {
    41. System.out.println(Thread.currentThread().getName()+"开始生产产品");
    42. while(true){
    43. try {
    44. Thread.sleep(10);
    45. } catch (InterruptedException e) {
    46. e.printStackTrace();
    47. }
    48. clerk.produceProduct();
    49. }
    50. }
    51. }
    52. //消费者
    53. class Consumers extends Thread{
    54. private Clerk clerk;
    55. public Consumers(Clerk clerk){
    56. this.clerk=clerk;
    57. }
    58. @Override
    59. public synchronized void run() {
    60. System.out.println(Thread.currentThread().getName()+":消费产品");
    61. while(true){
    62. try {
    63. Thread.sleep(10);
    64. } catch (InterruptedException e) {
    65. e.printStackTrace();
    66. }
    67. clerk.consumeProduct();
    68. }
    69. }
    70. }
    71. public class ProductTest {
    72. public static void main(String[] args) {
    73. Clerk clerk=new Clerk();
    74. Producer p1=new Producer(clerk);
    75. p1.setName("生产者");
    76. Consumers p2=new Consumers(clerk);
    77. p2.setName("消费者");
    78. p1.start();
    79. p2.start();
    80. }
    81. }

     

  • 相关阅读:
    如何快速构建研发效能度量的指标体系?
    flex布局
    数据资产为王,如何解析企业数字化转型与数据资产管理的关系?
    OpenSIPS配置脚本结构-》opensips.cfg
    AI导航网
    SpringMVC的请求处理流程及核心组件
    java基于微信小程序的电影院购票选座 uniapp 小程序
    课堂笔记| 第九章:泛型算法
    【UE 材质】常用向量运算节点——点积、叉积、归一化
    【图像去噪】基于边缘增强扩散 (cEED) 和 Coherence Enhancing Diffusion (cCED) 滤波器实现图像去噪附matlab代码
  • 原文地址:https://blog.csdn.net/fool_Java/article/details/126896701