创建线程方式之实现Runnable接口1

         创建线程的一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程。为何要实现Runnable接口,Runable是啥玩意呢?在API内搜索。查看Runnable接口说明文档:Runnable接口用来指定每个线程要执行的任务。包含了一个 run 的无参数抽象方法,需要由接口实现类重写该方法。

Runnable是在java.lang包下的接口,已知的实现类中主要是Thread类.

       其中接口的主要方法是void run(),即在实现接口Runnabled 的对象创建一个线程时候,启动该线程时,在独立执行的线程中直接调用对象的run方法.

Thread类的构造方法

Thread(Runnabletarget)

       分配新的Thread对象,以便将target作为运行对象.

      Thread(Runnabletarget,String name)

       分配新的Thread对象,以便将target作为运作对象,将指定的name作为其名称.

创建线程的步骤。

1、定义类实现Runnable接口。

2、覆盖接口中的run方法。。

3、创建Thread类的对象

4、将Runnable接口的子类对象作为参数传递给Thread类的构造函数。

5、调用Thread类的start方法开启线程。

代码演示:

public class Demo {

      publicstatic void main(String[] args) {

           //创建线程执行目标类对象

           Runnablerunn = new MyRunnable();

           //将Runnable接口的子类对象作为参数传递给Thread类的构造函数

           Threadthread = new Thread(runn);

           Threadthread2 = new Thread(runn);

           //开启线程

           thread.start();

           thread2.start();

           for(int i = 0; i < 10; i++) {

                 System.out.println("main线程:正在执行!"+i);

           }

      }

}

自定义线程执行任务类

public class MyRunnable implementsRunnable{

      //定义线程要执行的run方法逻辑

      @Override

      publicvoid run() {        

           for(int i = 0; i < 10; i++) {

                 System.out.println("该线程:正在执行!"+i);

           }

      }

}

 

         那么Runnable 是如何实现了线程的功能的呢?为什么需要定一个类去实现Runnable接口呢?继承Thread类和实现Runnable接口有啥区别呢?

实现Runnable接口,避免了继承Thread类的单继承局限性。覆盖Runnable接口中的run方法,将线程任务代码定义到run方法中。创建Thread类的对象,只有创建Thread类的对象才可以创建线程。线程任务已被封装到Runnable接口的run方法中,而这个run方法所属于Runnable接口的子类对象,所以将这个子类对象作为参数传递给Thread的构造函数,这样,线程对象创建时就可以明确要运行的线程的任务。

最后简单讲解一下实现Runnable的好处.

       实现Runnable接口避免了单继承的局限性,所以较为常用。实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。

继承Thread类,线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象,既是线程对象,有又有线程任务。

实现runnable接口,将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦。

编写线程同步模拟应用程序:

      1. 大气环境数据为:温度,湿度,风速;

      2. 一个大气环境传感器测量环境数据需要5秒时间;

      3. 一个计算机读取传感器获得数据需要0.01秒时间;

      4. 模拟100个计算机读取大气环境传感器获取的随机温度,湿度,风速; 

操作步骤答案

/*

 * 1.定义一个传感器类,实现Runnable接口

 */

publicclassSensor implements Runnable {

    Objectobj = newObject();

    /*

     *重写Runnablerun方法

     */

    @Override

    publicvoidrun() {     

       synchronized(obj) {

       //子线程睡眠5秒钟,模拟传感器获得温度,湿度,风速需要的5秒钟时间

           try{

              Thread.sleep(5000);

           }catch (InterruptedException e){

              e.printStackTrace();

           }         

       //使用Random模拟得到随机的温度,湿度和风速

           Randomr = newRandom();

       //温度

           inttemperature= r.nextInt(50)+1;

       // 湿度

           inthumidity= r.nextInt(100)+1;

       // 风速

           intwindScale= r.nextInt(40)+1;

       //子线程睡眠0.01,模拟计算机读取传感器的数据需要的0.01秒时间

           try{

              Thread.sleep(10);

           } catch(InterruptedException e) {

              e.printStackTrace();

           }

       //打印温度,湿度和风速, 模拟计算机读取传感器的数据

 

/*

 * 2.定义传感器的测试类

 */

publicclassSensorDemo {

 

    publicstaticvoidmain(String[] args) {

       //main方法中创建传感器类的对象

       Sensors = newSensor();

       //main方法中创建100个子线程对象,并把传感器对象传递给构造方法,模拟100个计算机

       for(intx=1;x<=100;x++){

           Threadt = newThread(s);

       //开启子线程,开启读取传感器的获取的大气环境数据

           t.start();

       }

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值