• 线程通信


    最近看到一多线程题目,觉得很有意义,虽然业务中尚未出现过,但保不定以后会用到。

    题目:编程主线程循环20次,子线程循环10次,以此循环往复50次

     1 public class Main {
     2 //    -1 双方均不运行, 0 主线程运行,1 子线程运行
     3     static volatile int flag = -1;
     4     static volatile int i = 0;
     5     static volatile int mainCount = 1;
     6     static volatile int childCount = 1;
     7 
     8     public static void main(String[] args) throws Exception {
     9         new Thread(() -> {
    10             child();
    11         }).start();
    12         for (i = 0; i < 50; i++) {
    13             if (flag < 0) {
    14 //                通知子线程开始运行
    15                 flag = 1;
    16             }
    17 //            cas检查标志位
    18             while (true) {
    19                 if (flag == 0) {
    20                     System.out.println(mainCount++ + "main-" + i);
    21                     for(int t =0; t < 20;t++) {}
    22 //                    更换标志,切换子线程运行
    23                     flag = 1;
    24 //                    退出cas
    25                     break;
    26                 }
    27                 sleep();
    28             }
    29             System.out.println("*********" + i + "*********");
    30         }
    31     }
    32 
    33     static void child() {
    34         while (true) {
    35 //            结束程序
    36             if (i >= 50) {
    37                 break;
    38             }
    39             if (flag == -1 || flag == 0) {
    40                 sleep();
    41             }
    42             System.out.println(childCount++ + "child-" + i);
    43             for(int t =0; t < 10;t++) {}
    44 //            更改标志,切换主线程运行
    45             flag = 0;
    46             sleep();
    47         }
    48     }
    49 
    50     static void sleep() {
    51         try {
    52             Thread.sleep(100);
    53         } catch (Exception e) {
    54         }
    55     }
    56 }

     两个线程交互数据

     1 public class Main {
     2     static Object lock = new Object();
     3     static int n = 0;
     4 
     5     public static void main(String[] args) {
     6         new Thread() {
     7             @Override
     8             public void run() {
     9                 while (true) {
    10                     synchronized (lock) {
    11                         if (n < 1) {
    12                             try {
    13                                 System.out.println("等待加酒");
    14                                 lock.wait();
    15                             } catch (InterruptedException e) {
    16                                 e.printStackTrace();
    17                             }
    18                         }
    19                         System.out.println("喝杯酒 -1");
    20                         n--;
    21                         try {
    22                             Thread.sleep(1000);
    23                         } catch (InterruptedException e) {
    24                             e.printStackTrace();
    25                         }
    26                         lock.notifyAll();
    27                     }
    28                 }
    29 
    30             }
    31         }.start();
    32 
    33         new Thread() {
    34             @Override
    35             public void run() {
    36                 while (true) {
    37                     synchronized (lock) {
    38                         if (n > 0) {
    39                             try {
    40                                 lock.wait();
    41                             } catch (InterruptedException e) {
    42                                 e.printStackTrace();
    43                             }
    44                         } else {
    45                             System.out.println("加杯酒 +1");
    46                             n++;
    47                             try {
    48                                 Thread.sleep(1000);
    49                             } catch (InterruptedException e) {
    50                                 e.printStackTrace();
    51                             }
    52                             lock.notifyAll();
    53                         }
    54                     }
    55                 }
    56             }
    57         }.start();
    58     }
    59 }

    运行结果 

  • 相关阅读:
    Linux常用解压文件
    微信开放平台 获取 component_verify_ticket
    mysql root密码重置
    编译安装LNMP
    JS生成二维码
    CURL采集
    JS拖动浮动DIV
    JS拖动DIV布局
    Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
    zepto.js 源码注释备份
  • 原文地址:https://www.cnblogs.com/shaozhen/p/11144625.html
Copyright © 2020-2023  润新知