• 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
  • 相关阅读:
    下拉选择框:数字从n到m
    event.target返回事件的目标节点(触发该事件的节点)
    nextSibling使用注意(html的注释)
    mysql导出 csv文件
    ie打印去掉页眉页脚
    jsp标签循环标签体
    String.format字符串格式化方法
    [**奇文共赏**补充问题] 据说看五遍能懂的人智商 > 200
    [转] ARP的处理办法!
    [转] 一张废手机卡的作用大全 (没试过)
  • 原文地址:https://www.cnblogs.com/gzgBlog/p/13598602.html
Copyright © 2020-2023  润新知