• 多线程


    继承Thread类

    1  子类继承Thread类具备多线程能力

    2  启动线程:子类对象.start()

    3  不建议使用:避免OOP但继承局限性。

    public class ThreadTest extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < 50; i++) {
                System.out.println("这里是run方法。。。。。"+i);
    
            }
        }
    
        public static void main(String[] args) {
            ThreadTest t1=new ThreadTest();
            t1.start();
            for (int i = 0; i < 200; i++) {
                System.out.println("这里是主方法。。。。、、、、"+i);
            }
        }
    }

    实现Runnable接口

    1 实现接口Runnable具有多线程能力

    2 启动线程:传入目标对象+Thread对象.start()

    3 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用

    但此是线程不安全的,会出现同资源被多个线程使用,造成混乱。

    // 买火车票,同一个对象(火车票),被多个线程(多个人买)使用。但此是线程不安全的,运行后出现同一张票被多个人买到的情况。
    
    public class BuyTicketThread 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) {
    //一份资源 BuyTicketThread buyTicketThread
    = new BuyTicketThread();
    //多个代理
    new Thread(buyTicketThread,"小龙").start(); new Thread(buyTicketThread,"老师").start(); new Thread(buyTicketThread,"黄牛党").start(); } }

    案例:模拟龟兔赛跑

    1 首先来个赛道距离,然后离终点越来越近
    2 判断比赛是否结束
    3 打印出胜利者
    4 比赛开始
    5 故事中乌龟总是赢的,兔子要睡觉,所以来模拟兔子睡觉
    6 终于,乌龟赢得了比赛
    public class Race implements Runnable {
    
        //胜利者
        private static String winner;
    
        @Override
        public void run() {
            for (int i = 0; i <=100 ; i++) {
                //模拟兔子休息
                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 is " + winner);
                    return true;
                }
            }
            return false;
        }
        public static void main(String[] args) {
            Race race=new Race();
            new Thread(race,"兔子").start();
            new Thread(race,"乌龟").start();
        }
    }
  • 相关阅读:
    NPOI单元格公式不刷新
    DIV+CSS HACK
    简答好用的邮件服务器hMailServer(转)
    C# 后台POST和GET 获取数据
    Quartz.Net1.0.2.3 配置记录
    ASP.NET自定义控件VS2012中添加失败(下列控件已成功添加到工具箱中,但未在活动设计器中启用)
    NPOI 1.2.5复制行(包括格式)
    Javascript中Null和Undefined的区别[转]
    测试流程(立项会)
    测试计划
  • 原文地址:https://www.cnblogs.com/dragon-lan/p/14065712.html
Copyright © 2020-2023  润新知