`

声明实现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线程对象。
分享到:
评论

相关推荐

    线程类实现Runnable接口

    声明自定义线程类实现Runnable接口实现奇数/偶数序列线程并发执行。

    实现runnable接口创建线程

    声明自定义线程类实现Runnable接口实现奇数/偶数序列线程并发执行。

    Java实现多线程轮流打印1-100的数字操作

    例如,`Thread1`、`Thread2`和`Thread3`分别负责打印1-100序列中的奇数、偶数和质数。 对于两个线程交替打印1-100的奇偶数,代码中使用了一个`volatile`关键字修饰的`flag`变量。`volatile`关键字确保了多个线程...

    答复: 一道经典线程面试题的4种解法

    这可能涉及到一个常见的面试题——打印交替的数字序列,比如线程A打印奇数,线程B打印偶数,而这两个线程需要协调工作,确保交替进行。 为了实现这样的功能,开发者可能会使用`synchronized`关键字控制共享资源的...

    JavaSE笔试程序题(20180307)

    27. **奇偶数序列求和**:可以使用数学公式解决,或者奇数偶数分开处理后相加。 28. **阶乘计算**:递归实现,需注意防止溢出。 29. **选手得分计算**:根据给定的接口实现计算逻辑,可能需要处理负数和小数。 ...

    Odd_Even_Thread

    通过创建和启动`Thread`对象或者使用`Runnable`接口,开发者可以构建多线程应用程序。 2. **线程同步**:在多线程环境中,当多个线程访问共享资源时,可能引发数据不一致的问题。线程同步是解决这个问题的关键,它...

    java面试题及答案-非常全面(包括基础、网络、数据结构、算法及IT大厂面经)

    - **类型**:包括JDK动态代理(实现接口)和CGLIB动态代理(子类继承)。 ### 设计模式 - **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。 - **工厂模式**:提供创建一系列相关或相互依赖对象的...

Global site tag (gtag.js) - Google Analytics