第一个方式是---继承Thread类
继承Thread类存在不足, 继承Thread类相当于继承的是整个线程机制,同时继承Thread类中的所有方法。
在若已经有父类的情况下还需要父类继承Thread类才可以。
第二种方式是---通过实现runnable接口方式。这种方法是比较推荐使用的
我们在定义一个自己的类时可以让它实现runnable接口,接口的实现本身就是一种功能的扩充。
而我们正是想实现多线程这种功能。
实现runnable接口后只需要重写接口中run方法即可。我们可以将我们要在单独线程要执行的代码(要完成的任务)封装为一个函数,然后再run方法中调用该函数,即可实现。
简单程序实现:
class Demo implements Runnable
{
public void run()
{
show();
}
public void show()
{
for(int i=0;i<20;i++)
System.out.println("run..."+Thread.currentThread().getName());
}
}
class ThreadDemo2
{
public static void main(String[] args)
{
Demo d = new Demo();
Thread t = new Thread(d);
Thread t1 = new Thread(d);
t.start();
t1.start();
}
}
Thread t = new Thread(d) Thread类的构造函数有一个接受一个runnable接口形式参数的构造函数
start方法:class Thread{ public void start(){ run()}}
<span style="font-family: Arial, Helvetica, sans-serif;">runnable接口只有一个run方法,实现runnable接口后只需要重写该run方法即可。</span>
为啥要在Thread构造函数传递实现runnable接口的子类对象。
因为线程要执行的任务(代码)封装在了该对象的run方法中。线程在创建时要明确要执行的任务。