zoukankan      html  css  js  c++  java
  • Java多线程:实现Runnable接口创建线程方式详解

    先看例子:###

    /**实现Runnable接口创建线程步骤:
     * 1、创建一个实现Runnable接口的类
     * 2、重写Runnable类中抽象的run()方法
     * 3、创建实现类的对象
     * 4、声明Thread类,同时将实现类对象作为参数传递
     * 5、用Thread类的对象调用start()
     */
    //例子:多线程售票(暂未安全同步)
    class MyThread implements Runnable{
        private int num = 100;
        public void run(){
            while (true){
                System.out.println(Thread.currentThread().getName()+"票号:"+num--);
                if(num == 0)
                    break;
            }
        }
    }
    public class ThreadTest2 {
        public static void main(String[] args) {
            //m相当于是提供了线程所要执行的run(),所以可以供不同线程调用
            MyThread myThread = new MyThread();
    
            //将Runnable实现类的对象传递给Thread类中的Runnable类型的属性,由此调实现用
            Thread t = new Thread(myThread);
            Thread t1 = new Thread(myThread);
            Thread t2 = new Thread(myThread);
            //设置线程名
            t.setName("窗口1:");
            t1.setName("窗口2:");
            t2.setName("窗口3:");
            //通过调用start执行myThread对象的run(),实现三个线程共用一个方法,但是对象始终只有一个,记录票数的子类也只有一个
            t.start();
            t1.start();
            t2.start();
        }
    }
    

    解析:

    通过源码发现Thread类也实现了Runnable接口,通过所以此创建实例的过程是一个Runnable的实现类对象(myThread),传递给另一个Runnable实现类对象(t、t1、t2)的过程,而Thread类中还定义了个Runnable类型的属性,用于配合接收Thread类的带参构造器传递过来的Runnable类型的对象,现在对象有了,要调用什么姿势还不是拍拍屁股的事情?(实际是Thread类中的run()判断出有Runnable对象传递进来了,就通过该对象调用run())

    补充:忽略安全同步问题,例子实现了多线程售票,可以看出start()方法负责开启线程并调用负责线程执行内容的run()方法。

  • 相关阅读:
    推荐系统入门笔记2--信息检索 Lucene
    Mybatis多个参数,其中有hashMap的写法
    Java中fastjson的toJSONString结果为空{}
    Linux中less命令出现ESC乱码
    关于博客
    【Uni-App】关于获取手机系统信息的项目实践
    mysql 服务列表找不到
    服务网格与Istio
    ARM架构服务器如何运行EasyNVR软件提示无法识别二进制文件排查及解决
    关于EasyNVR拉流摄像头的视频流存在视频流锁定机制的问题说明
  • 原文地址:https://www.cnblogs.com/csyh/p/12257542.html
Copyright © 2011-2022 走看看