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
  • 相关阅读:
    为什么重复值高的字段不能建索引(比如性别字段等)
    【转】微服务架构技术栈选型手册
    【转】使用索引为什么能提高查询速度?
    SpringBoot读取配置文件(从classpath/file读取yml/properties文件)
    集合总结--ArrayList、LinkedList、HashMap
    HashMap问答
    【转】http的keep-alive和tcp的keepalive区别
    【转】大数据分析中Redis怎么做到220万ops
    哪个中年IT男不是一边面对危机,一边咬牙硬抗【转】
    SVN clean失败解决方法【转】
  • 原文地址:https://www.cnblogs.com/gzgBlog/p/13598602.html
Copyright © 2011-2022 走看看