Java里创建线程常见的且比较简单方式主要有下面两种:
1.继承Thread类,并且覆盖run()方法
代码:
创建10个线程,打印线程名字+Hello:
/*
* 通过继承Thread类来创建线程
*/
public class MyThread_thread extends Thread{
public void run(){
System.out.println(Thread.currentThread().getName()+": Hello");
}
public static void main(String[] args) {
for(int i=0; i<10; i++){
System.out.println("创建一个线程");
MyThread_thread t = new MyThread_thread();
System.out.println("启动线程");
t.start();
}
}
}
运行结果:
由运行结果可以看出,在多线程编程时,具有两个随机性:
线程的随机性:start()方法的调用顺序不代表线程的启动顺序,所以会出现这种乱乱的结果,而不是按照0-9的顺序依次启动线程。
线程调用的随机性:代码书写顺序不代表代码的执行顺序,因为线程是一个子任务,CPU会为每个线程分配时间片,并以不确定的方式调用run()方法,所以会出现这种乱乱的结果,而不是按照【“创建一个线程”,“启动线程”,线程名字:Hello】这种中规中矩的顺序打印。
要适应并且习惯这种随机性。
很显然,由于java不支持对类的多继承,所以如果继承了Thread类就没办法再继承其它父类了,所以更建议使用如下的第二种方式。
2.实现Runnable接口,覆盖run()方法,并且使用Thread(Runnable target)这个构造函数创建Thread对象
代码:
创建10个线程,打印线程名字+Hello:
/*
* 通过实现Runnable接口创建线程
*/
public class MyThread_runnable implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+": Hello");
}
public static void main(String[] args) {
for(int i=0; i<10; i++){
System.out.println("创建一个线程");
MyThread_runnable r = new MyThread_runnable();
Thread t = new Thread(r);
System.out.println("启动线程");
t.start();
}
}
}
运行结果:
同样也出现了上述的随机性。
总结:
- 本质上这两种方式是等价的,但是由于java不支持对类的多继承,所以更推荐通过实现Runnable接口的方式创建线程。
- 根据java api,Thread类本身也是实现了Runnable接口,
public class Thread implements Runnable
。