创建线程的一种方法是声明实现 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();
/*
*重写Runnable的run方法
*/
@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();
}
}
}