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
  • 相关阅读:
    sockjs-node/info?t=报错解决
    微信昵称表情符号前端显示问题
    vue-cli 3.0项目安装报错
    vue-cli项目按需引入element-ui实际操作
    javafx分别设置四个边框
    springmvc使用<mvc:default-servlet-handler/>导致的handler失效
    windows注册表删除右键菜单
    计算机实现32位整数加减乘除的方法
    常用排序算法
    AbstractCollection类中的 T[] toArray(T[] a)方法源码解读
  • 原文地址:https://www.cnblogs.com/gzgBlog/p/13598602.html
Copyright © 2011-2022 走看看