声明继承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()方法,提供线程执行的线程体。
程序运行结果是变化的,这里展示其中几种运行结果
[color=blue]情况一[/color]:
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 偶数序列结束!
[color=blue]情况二[/color]:
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 奇数线程结束!
[color=blue]情况三[/color]:
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个线程在并发地执行,如图所示

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

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

情况2 说明一下
加一个序列,[color=red]此时main线程一直运行[/color],看下图

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 查看结果图如下:


[img]http://dl2.iteye.com/upload/attachment/0130/2360/c2387ae8-6162-3749-a262-5a3708de63bd.png[/img]

[img]http://dl2.iteye.com/upload/attachment/0130/2362/513efe43-49df-35f8-b1a5-085d43c38d44.png[/img]

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

[img]http://dl2.iteye.com/upload/attachment/0130/2364/3c9f249f-d79f-33f4-90df-14a30c5850f8.png[/img]
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值