zoukankan      html  css  js  c++  java
  • 63.Java创建多线程方式二实现Runnable接口

    创建线程的方式二实现Runnable接口

    创建线程的第二种方式.使用Runnable接口.

    该类中的代码就是对线程要执行的任务的定义.

    1:定义了实现Runnable接口

    2:重写Runnable接口中的run方法,就是将线程运行的代码放入在run方法中

    3:通过Thread类建立线程对象

    4:将Runnable接口的子类对象作为实际参数,传递给Thread类构造方法

    5:调用Thread类的start方法开启线程,并调用Runable接口子类run方法

    为什么要将Runnable接口的子类对象传递给Thread的构造函数,因为自定义的run方法所属对象是Runnable接口的子类对象,所以要让线程去执行指定对象的run方法

    public class Demo1 {
        public static void main(String[] args) {
            MyRun my = new MyRun();
            Thread t1 = new Thread(my);
            t1.start();
            for (int i = 0; i < 200; i++) {
                System.out.println("main:" + i);
            }
        }
    }
    class MyRun implements Runnable {
        public void run() {
            for (int i = 0; i < 200; i++) {
                System.err.println("MyRun:" + i);
            }
        }
    }

    理解Runnable:

    Thread类可以理解为一个工人,而Runnable的实现类的对象就是这个工人的工作(通过构造方法传递).Runnable接口中只有一个方法run方法,该方法中定义的事会被新线程执行的代码.当我们把Runnable的子类对象传递给Thread的构造时,实际上就是让给Thread取得run方法,就是给了Thread一项任务.

     

    买票例子使用Runnable接口实现

    在上面的代码中故意照成线程执行完后,执行Thread.sleep(100),以让cpu让给别的线程,该方法会出现非运行时异常需要处理,这里必须进行try{}catch(){},因为子类不能比父类抛出更多的异常,接口定义中没有异常,实现类也不能抛出异常。

    运行发现票号出现了负数,显示了同一张票被卖了4次的情况。

    出现了同样的问题。如何解决?

    class MyTicket implements Runnable {
        int tickets = 100;
        public void run() {
            while (true) {
                if (tickets > 0) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "窗口@销售:"
                            + tickets + "号票");
                    tickets--;
                    
                } else {
                    System.out.println("票已卖完。。。");
                    break;
                }
            }
        }
    }
    public class Demo6 {
        public static void main(String[] args) {
            MyTicket mt = new MyTicket();
            Thread t1 = new Thread(mt);
            Thread t2 = new Thread(mt);
            Thread t3 = new Thread(mt);
            Thread t4 = new Thread(mt);
            t1.start();
            t2.start();
            t3.start();
            t4.start();
        }
    }
    author@nohert
  • 相关阅读:
    面试90%都会翻车的高并发分布式事务,我劝你好好啃透!
    JVM最多支持多少个线程?你知道吗?
    利用注解 + 反射消除重复代码(Java项目)
    ASP.NET HTTP模拟提交通用类 GET POST
    UPW学习资料整理 .NET C# 转
    前端引擎初步设计稿 -通过配置生成动态页面 ,LandaSugar平台 .NET-C#-MVC
    分享一个ASP.NET 文件压缩解压类 C#
    验证码的种类与实现 C#封装类
    ASP.NET MVC 使用 IOC框架 AutoFac 自动释放数据库资源
    ASP.NET MVC权限验证 封装类
  • 原文地址:https://www.cnblogs.com/gzgBlog/p/13598602.html
Copyright © 2011-2022 走看看