package com.jbx.thread;
/**声明实现Runnable接口的奇数/偶数序列线程
* Created by Administrator on 2018/7/11.
*/
public class NumberRunnable implements Runnable{
private int first;
public NumberRunnable(int first){
this.first = first;
}
public NumberRunnable(){
this(0);
}
@Override
public void run() { //线程体,实现Runnable接口
System.out.println();
for (int i = first; i < 50 ; i+=2) {
System.out.print(i+" ");
}
System.out.println("结束! ");
}
public static void main(String [] args){
NumberRunnable odd = new NumberRunnable(1);//创建具有线程体的目标对象
Thread thread_odd = new Thread(odd,"奇数线程");
thread_odd.start();
new Thread(new NumberRunnable(2),"偶数线程").start();
}
}
运行结果:
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 结束!
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 结束!
本例声明的NumberRunnable类实现Runnable接口,不是Thread的子类。NumberRunnable对象odd不是线程对象,没有start()等方法,但odd具有实现了的run()方法,这种对象可以作为一个线程对象的目标对象。
Thread类的run()方法声明如下:
public void run(){ //描述线程操作的线程体
if(target != null){
target.run(); //执行目标对象的run()方法
}
}
由此可知,当目标对象为空时,Thread类的对象的run()方法为空。例如:
Thread t1 = new Thread(); //t1的run()方法为空
当目标对象非空时,Thread对象将执行目标对象的run()方法。例如
Thread thread_odd = new Thread(odd,"奇数线程");
声明线程对象thread_odd的目标对象是odd,意味着,thread_odd线程执行odd的run()方法。
由于NumberThread是Thread的子类,声明非空的run()方法覆盖Thread类的run()方法,所以,NumberThread对象执行的是自己的run()方法,因此,不需要目标对象。
3.两种创建线程方式的比较
前两例分别使用两种方式创建线程,效果相同。那么,在实际编程中如何选用这两种方式呢?
说明如下:
(1) 继承线程Thread类
声明一个线程类继承Thread类,并且覆盖Thread类的run()方法,说明线程对象所执行的操作。这种方式的优点是,Thread类的子类对象就是线程对象,具有Thread类声明的方法,且具有线程体。缺点是,不适用于多重继承。
(2)实现Runnable接口
当一个类已继承一个父类,还要以线程方式运行时,就需要实现Runnable接口和Thread类。一个实现Runnable接口的对象本身不是线程对象,它作为一个线程对象的目标对象使用,因此,同时需要声明一个Thread线程对象。