首先 Thread是类,Runnable是接口。
一是写一个类继承自Thread类,然后重写里面的run方法,用start方法启动线程
二是写一个类实现Runnable接口,实现里面的run方法,用new Thread(Runnable target).start()方法来启动。
两个都可以实现多线程编程,但是基于java是单继承,所以实现Runable更灵活。并且Runable可以简单的实现变量的线程间共享。
创建线程包括继承Thread类和实现Runnable接口两种方式(JDK5.0以后还包括了实现Callable等方式来实现线程,这里不做介绍,感兴趣的可以自己查资料),下面介绍第一种创建线程的方式(通过继承Thread类):
package com.test.thread;
public class EasyThread extends Thread {
private String name;
public EasyThread(String name) {
this.name=name;
}
//重写父类Thread中的run方法
@Override
public void run() {
for (int i = 0; i <2; i++) {
System.out.println(name+"运行"+i);
try {
//随机设置休眠时间
sleep((int)Math.random()*10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
public static void main(String[] args) {
//创建一个线程
EasyThread thread1=new EasyThread("线程1");
//启动线程(启动线程后会执行上面的run方法)
thread1.start();
EasyThread thread2=new EasyThread("线程2");
thread2.start();
}
}
多次运行上述代码,查看运行结果,发现可能每次的输出结果可能与上次相同也可能不同。原因是休眠时间不同,导致运行的结果不尽相同,可以好好体会一下。下面讲述第二种创建线程的方式(实现Runnable接口):
package com.test.thread;
public class ImpRunnable implements Runnable {
private String name;
public ImpRunnable(String name) {
this.name = name;
}
// 实现接口Runnable中的run方法
@Override
public void run() {
for (int i = 0; i < 2; i++) {
System.out.println(name + "运行" + i);
try {
// 随机设置休眠时间
Thread.sleep((int) Math.random() * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
public static void main(String[] args) {
// 创建线程并启动(与第一种方法略有不同)
new Thread(new ImpRunnable("线程1")).start();
new Thread(new ImpRunnable("线程2")).start();
}
}
以上即为实现线程的两种常用的方式,在使用多线程(多个人共同完成同一个任务)的时候我们一般用实现Runnable接口的方式,原因上面也说了,一是Rannale是一个接口实现起来更加灵活,另一个是Runnable可以实现简单的线程共享。