编辑器:Notepad++,学习视频:毕向东Java基础教程
线程创建方式二:实现Runnable接口
(1)步骤:
- 定义类实现Runnable接口
- 覆盖接口中的run方法,将线程的任务代码封装到run方法中
- 创建Thread类对象作为线程对象,并将Runnable的子类对象作为Thread类的构造函数的参数进行传递。这其中利用了Thread(Runnable target)
- 调用线程对象的start方法开启线程
(2)为何要将Runnable的子类对象作为Thread的构造函数参数进行传递?
- 因为线程的任务代码都封装在Runnable接口的子类对象的run方法中,所以要在线程对象创建时,必须明确线程要执行的任务;不传递的话,线程会运行自己的run方法中的任务代码而不是实现Runnable接口的子类对象中的run方法的任务代码。
(3)实现Runnable接口的好处:
- 将线程的任务从线程的子类中分离出来,进行单独的封装,按照面向对象的思想,将任务封装成对象
- 避免了Java单继承的局限性(仅为了复写某方法而继承了父类的全部方法,不一定为我所需)
//线程创建方式二:实现Runnable接口
//适用于多个线程同时使用某个类的方法,复写Runnable中的run方法,将该方法定义其中
class Demo1 implements Runnable //扩展该类,让其中的方法可以作为线程的任务执行,这可通过接口来完成
//第一步:实现 Runnable 接口
{
public void run() //第二步:覆盖Runnable接口中的run()方法
{
show();
}
public void show()
{
for(int x=0;x<9;x++)
{
System.out.println("ThreadName= "+Thread.currentThread().getName());
}
}
}
class ThreadDemo1
{
public static void main(String[] args)
{
//第三步:实例化自定义的类对象和Thread类对象,并将自定义的类对象作为参数传递给thread
Demo1 d = new Demo1();
Thread t1 = new Thread(d); //利用Thread(Runnable target)
Thread t2 = new Thread(d);
//第四步:调用start(),启动线程
t1.start();
t2.start();
}
}