`

声明实现Runnable接口的奇数/偶数序列线程

 
阅读更多
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线程对象。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics