• Java多线程(三)实现多线程的三种方法之Runnable接口


    Java实现多线程的三种方法

    •     继承Thread类
    •     实现Runnable接口
    •     实现Callable接口,这JUC并发包下的,属于比较高级的用法

    这里讲的是第二种方法.

    本篇内容:

    1. 演示如何通过Runnable接口实现多线程
    2. 演示多线程模拟龟兔赛跑

    1. 通过实现Runnable接口

    public class ThreadDemo {
        public static void main(String[] args) {
    
            //创建Runnable接口的实现类对象
            TicketWinow tw = new TicketWinow();
            //创建代理类,并把实现类对象作为参数传给代理类的构造方法
            Thread t = new Thread(tw, "Windows00");
            t.start();
            //下面的循环只是把上面的两步合并成一步而已
            for (int i = 0; i < 5; i++) {
                new Thread(new TicketWinow()).start();
            }
        }
    }
    
    class TicketWinow implements Runnable {
    
        private static int ticketNum = 50;
    
        //重写run()方法
        @Override
        public void run() {
            while (ticketNum > 0) {
                System.out.println(Thread.currentThread().getName() + "正在售第" + (ticketNum--) + "张票!");
            }
        }
    }

    2.用Runnable接口实现多线程模拟龟兔赛跑

    public class ThreadDemo {
        public static void main(String[] args) throws InterruptedException {
            Racer racer = new Racer();
            new Thread(racer, "乌龟").start();
            new Thread(racer, "兔子").start();
        }
    }
    
    class Racer implements Runnable {
        private String winner;
    
        //重写run()方法
        @Override
        public void run() {
            for (int step = 0; step <= 100; step++) {
                //模拟让兔子睡觉
                if(Thread.currentThread().getName().equals("兔子") && step%10==0 ){
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName() + "跑了第" + step + "步.");
                boolean flag = isGameOver(step);
                if (flag) {
                    break;
                }
            }
        }
    
        public boolean isGameOver(int steps) {
            if (winner != null) {
                return true;
            } else {
                if (steps == 100) {
                    winner = Thread.currentThread().getName();
                    System.out.println("胜利者是:" + winner);
                    return true;
                }
            }
            return false;
        }
    }

    重点:

    Thread.sleep(int i);//暂停线程i秒
    Thread.currentThread().getName()//获得当前线程名字
     
  • 相关阅读:
    深度学习和神经网络的区别是什么
    各种数据类型范围
    排队接水
    最大整数
    马拉松接力赛
    合并果子
    统计学生信息(使用链表完成)
    删除数组中的元素(链表)
    求最大公约数(最小公倍数)
    十进制转化成八进制(一到十六进制)
  • 原文地址:https://www.cnblogs.com/majestyking/p/12427391.html
Copyright © 2020-2023  润新知