zoukankan      html  css  js  c++  java
  • 多线程

    继承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();
        }
    }
  • 相关阅读:
    kendo DataSource
    动态改变kendoGrid的数据、列和基础设置
    kendoValidator 验证
    块级元素的水平、垂直居中
    kendoUpload 上传控件
    916数据结构额外考题
    916 数据结构与算法考纲
    英语六级作文翻译
    考研线性代数
    蓝牙室内定位技术原理
  • 原文地址:https://www.cnblogs.com/dragon-lan/p/14065712.html
Copyright © 2011-2022 走看看