• Java并发初识


    并发初识

    案例:实现一个抢火车票的案例demo

    package com.thread;
    
    // 多线程同时操作同一个对象
    // 买火车票的例子
    
    // 发现问题:多线程操作同一个资源的情况下,线程不安全,数据紊乱
    public class TestThread4 implements Runnable {
    
        // 票数
        private int ticketNums = 10;
    
    
        @Override
        public void run() {
            while (true) {
                if (ticketNums <= 0) {
                    break;
                }
                // 模拟延时
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "拿到了第" + ticketNums-- + "票");
            }
        }
    
        public static void main(String[] args) {
            TestThread4 ticket = new TestThread4();
    
            new Thread(ticket, "小明").start();
            new Thread(ticket, "老师").start();
            new Thread(ticket, "黄油党").start();
        }
    }
    
    
    黄油党拿到了第10票
    老师拿到了第8票
    小明拿到了第9票
    老师拿到了第7票
    小明拿到了第5票
    黄油党拿到了第6票
    小明拿到了第4票
    黄油党拿到了第4票
    老师拿到了第3票
    小明拿到了第2票
    黄油党拿到了第1票
    老师拿到了第0票
    

    案例:龟兔赛跑

    1. 首先来个赛道距离,然后要离终点越来越近
    2. 判断比赛是否结束
    3. 打印出胜利者
    4. 龟兔赛跑开始
    5. 故事中乌龟是赢的,兔子需要睡觉,所以我们需要来模拟兔子睡觉
    6. 终于,乌龟赢得比赛
    package com.thread;
    
    // 模拟龟兔赛跑
    public class Race implements Runnable {
        // 胜利者
        private static String winner;
    
        @Override
        public void run() {
            for (int i = 1; i <= 100; i++) {
    
                // 模拟兔子睡觉 每10步并且是兔子让它睡一会
                if (Thread.currentThread().getName().equals("兔子") && i % 10 == 0) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
    
                // 判断比赛是否结束
                boolean flag = gameOver(i);
                if (flag) {
                    // 比赛结束了就停止循环
                    break;
                }
    
                System.out.println(Thread.currentThread().getName() + "跑了" + i + "步");
            }
        }
    
        // 判断是否完成比赛
        private boolean gameOver(int steps) {
            // 判断是否有胜利者
            if (winner != null) {
                // 已经存在胜利者了,比赛结束
                return true;
            } else {
                if (steps >= 100) {
                    winner = Thread.currentThread().getName();
                    System.out.println("胜利者是: " + winner);
                    return true;
                }
            }
    
            return false;
        }
    
        public static void main(String[] args) {
            Race race = new Race();
    
            new Thread(race, "兔子").start();
            new Thread(race, "乌龟").start();
        }
    }
    
    
  • 相关阅读:
    图片自动播放
    选项卡切换
    jquery实现全选、反选、不选
    JQuery $()后面的括号里的内容什么时候加引号,什么时候不加
    ajax跨域jsonp
    加班与效率
    提问的智慧
    程序员要勇于说不
    编程从业五年的十四条经验,句句朴实
    成为高效程序员的7个重要习惯
  • 原文地址:https://www.cnblogs.com/wxvirus/p/15759759.html
Copyright © 2020-2023  润新知