`

声明继承Thread类的奇数/偶数序列线程

 
阅读更多
package com.jbx.com;


/**
 * @author Administrator
 * @date 2018-7-10下午09:54:20
 * @todo 声明继承Thread类的奇数/偶数序列线程
 * 本例演示通过继承Thread类设计线程。
 * 以下声明线程类NumberThread继承Thread类,提供输出一个奇数(或偶数)序列的run()方法
 * 序列初值由成员变量first设置
 */
public class NumberThread extends Thread{
	private int first;
	
	public NumberThread(String name,int first){
		super(name);
		this.first = first;
	}
    public NumberThread(String name){
    	this(name, 0);
    }
    
    public void run(){ //线程体,覆盖Thread的run()
    	System.out.print("\n"+this.getName()+":   ");
    	for(int i=first;i<50;i+=2){
    		System.out.print(i+" ");
    	}
    	System.out.println(this.getName()+"结束! ");
    }
	
    public static void main(String[] args) {
		System.out.println("currentThread="+Thread.currentThread().getName());//输出当前线程对象
		NumberThread thread_odd = new NumberThread("奇数线程", 1);//创建线程对象
		NumberThread thread_even = new NumberThread("偶数序列", 2);
		thread_odd.start();        //启动线程对象
		thread_even.start();
		System.out.println("activeCount="+thread_even.activeCount());//输出当前活动线程数
	}
}



其中run()方法覆盖Thread类的run()方法,提供线程执行的线程体。
程序运行结果是变化的,这里展示其中几种运行结果
情况一
currentThread=main
activeCount=3

奇数线程:   1
偶数序列:   3 2 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 奇数线程结束!
4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 偶数序列结束!
情况二
currentThread=main
activeCount=3

偶数序列:   2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 偶数序列结束!

奇数线程:   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 奇数线程结束!
情况三
currentThread=main

奇数线程:   activeCount=3

偶数序列:   2 4 6 8 10 1 3 5 7 9 11 13 15 12 17 14 19 16 21 18 23 20 25 22 27 24 29 26 31 28 33 30 35 32 37 34 39 36 41 38 43 40 45 42 47 44 49 46 奇数线程结束!
48 偶数序列结束!

程序设计说明如下:
1.main线程
     一个运行Java程序的进程,默认首先启动执行的线程是main。在main()方法中创建了两个线程对象thread_odd、thread_even,调用start()方法启动这两个线程对象后,分别执行各自run()方法中的线程体,输出一个数据序列。此时,进程中包含了3个线程在并发地执行,如图所示


2.线程执行
       在main()方法中,先启动两个线程对象,再输出activeCount;而运行结果则是,先输出activeCount 值为3,才输出两个数据序列。这说明,main线程先于其他线程执行,main线程执行后,才执行其他线程。
   线程启动语句的顺序不能决定线程执行次序。线程启动后处于就绪状态,等待操作系统调度执行,线程何时执行、线程执行次序以及是否被打断均不由程序控制。如果线程执行时间过长或其他原因,线程执行将被中断,等待再次调度执行。因此,线程的运行结果具有不确定性。本例,当输出序列较长时,奇数线程和偶数线程交替运行,交替输出序列值。

思考:
按以下要求调整程序,观察不同的运行结果
1.将序列长度缩短至线程不被打断
2.在main()方法中输出较长数据序列后,再启动奇数线程和偶数线程
3.将序列长度增长至线程被多次打断

情况2 说明一下
加一个序列,此时main线程一直运行,看下图
 public static void main(String[] args) {
		System.out.println("currentThread="+Thread.currentThread().getName());//输出当前线程对象
		for(int i = 0;i<1000000000;i++){
			System.out.print(i+" ");
		}
		NumberThread thread_odd = new NumberThread("奇数线程", 1);//创建线程对象
		NumberThread thread_even = new NumberThread("偶数序列", 2);
		thread_odd.start();        //启动线程对象
		thread_even.start();
		System.out.println("activeCount="+thread_even.activeCount());//输出当前活动线程数
	}
}

通过java自带检测命令jvisualvm 查看结果图如下:






也可以通过java自带的jconsole命令查看线程的情况



  • 大小: 17.6 KB
  • 大小: 69.3 KB
  • 大小: 77.7 KB
  • 大小: 84.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics