Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

Java入门(13) More Java!

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

  然后,我们再执行命令:


java testThread

  程序的输出如下图所示:

13-17

  图13-17 程序testThread.java的输出

  你看,三个人在赛跑!看谁快,他们太接近了,谁是第一名呢?所以我们来看看在DOS窗口的输出:

13-18

  图13-18 MS-DOS下的输出

  我们看到,程序的输出给出了公正的判决。第一次赛跑(第一次运行这个程序),冠军是第三道(Racer #2),第一道(Racer #0)屈居第二,第二道(Racer #1)是最后一名。第二次赛跑时,第二道反而成为了第一名。我们再运行几次程序,就会发现每一次的成绩都可能不同。你来可以使用以下命令来让更多的“人”参加赛跑:


java testThread 5

  传授新知

  这个程序太庞大了,也许会把大家吓倒!我们来看一下这个程序结构。这个示例由两个文件组成:testThread.java和Threader.java。

  其中,Threader中定义了竞赛者对象,我们先一起来看一下这个类:

  1)


public Threader (String inName)
{
myName=new String (inName);
}

  这是类Threader中构造器方法,它为Threader设置对象名。

  2)


public synchronized void paint(Graphics g)
{
g.setColor (Color.black);
g.drawLine (0,getSize().height/2,getSize().width,
getSize().height/2);
g.setColor (Color.yellow);
g.fillOval((myPosition*getSize().width/numberofSteps),0,
15,getSize().height);
}

  我们为Threader类定义了一个paint方法,我们看一下这个方法做了些什么:

  前两条语句用来画出这个竞赛者(Threader)的赛道,一条黑色的赛道!这条赛道用一根线来表示:它从(0,getSize().height/2)到(getSize().width,getSize().height/2)。也就是一个从最左边到最右边的,位于中心的黑线。

  然后,我们画出这个竞赛者,它用一个黄色的椭圆来表示。这个椭圆宽15,高为整个格子,位置由变量myPosition决定。

  一些提示:

  我们将myPosition的初值设置为0.将整个赛道分成numberofSteps步,即600步。MyPosition每加1,就走过一步。

  2)


public void run() {
while ((myPosition 

  这是一个while循环,当myposition小于numberofSteps,就将myposition加1(往前走一步),然后重画(这样这一步就会显示出来)。

  如果myposition=numberofSteps时,意味着什么?对,意味着走完了赛程,因此,打印出完成信息。

  大家看到,我们重画后,我们使用了这样一条语句:


Thread.currentThread().sleep(10);

  这是让当前线程进入休眠状态一小会(10个时间周期)。这是为什么呢?要理解这个问题,我们需要学习一下CPU是如何管理这些线程的。线程与进程一样有三种状态:

  § 运行态:线程正在运行;

  § 就绪态:线程一切就绪,可以运行,正在等待CPU运行;

  § 阻塞态:线程未准备就绪,正在等待某个条件。

  其间的关系,如下图所示:

13-19

  图13-19 线程状态转换图

  由于在单处理器的系统中,一个时间内CPU只能运行一个线程。所以如果我们在每个竞赛者跑一步时,就让它休眠(进入阻塞态,等待休眠时间到),这样就不会让一个线程一直占用CPU,以免不公平嘛!

  由于我们让线程的休眠时间比较短,所以一会就回到了,这时线程就进入就绪态,等待CPU有时间的时候运行。CPU呢一有时间,就从就绪的线程中选择一个来运行。

  大家看到这里,可能早已昏头转向了,下面我们举一个生活中的例子来模拟一下这个情况:有三位职员(对应程序中的三个竞赛者、即三个线程)要向经理(对应运行线程的CPU)汇报工作。但这个经理采用了一个十分公平的方法(当然在现实生活中是不可能的)来接受三个职员的汇报。也就是每一个职员一次只说一句话(每一个竞赛者跑一步),然后就呆一边休息一下(休眠10个时间周期),然后从另两个职员中任选一个来说(选择就绪的线程)。也是说一句话,就让他休息。这样周而复始,直到他们都汇报完毕。

  情况如下图所示:

13-20

  图13-20 竞赛者线程示意图

  一些提示:

  以上所述的关于线程的描述,是基于支持多线程的系统。如果不支持多线程的话,这是不成立的。在不支持线程的系统中,则将线程改成进程就行了。

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<

上一页 1 2 3 4 5 6 78 9 10 11 下一页


上一篇:Java入门(11) 让程序更动人   下一篇:JSP 技术白皮书

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
·Motorola微处理器bootloader分析与应用
·Fedora Core5 NFS服务器搭建过程介绍
·Linux系统:让内存不再泄漏的实用技巧
·新手看招 手把手教你安装VMware虚拟机
·“侵权事件” 红帽称微软企图干扰用户
·删除Linux后 如何找回Windows启动菜单
·菜鸟乐园 Linux中常见文件系统格式介绍
·Linux操作系统下IPTables配置方法详解
·实用技巧 Linux系统的经典使用技巧八则
·Linux系统文件优化及磁盘检查方法介绍
推荐文章
·当Linux分区出错时的处理
·[软件安装]软件安装通用思路
·Linux用户要注意修复漏洞
·Unix用户如何在酒馆勾搭美眉!(joke)
·Linux命令Man解释:PPPD(8) :点对点d
·Veclinux 初步印象
·安全操作系统研究的发展
·Java入门(5) JAVA语言基本语法
精彩文章
·如何监测内存泄漏
·Linux下ip隧道研究(1)
·Linux组网入门(2):FTP服务器
·增强Sendmail的抗DoS攻击能力
·用 Linux 打造路由器
·Linux 核心--12.Linux内核机制
·Jini和RMI开发中的codebase问题
·Linux关机命令详解
·GNU/Linux和FreeBSD上的NAT网关安装
·CVS服务器快速指南
·Linux系统:让内存不再泄漏的实用技
·Linux 内核的类型
·[安装]ISO文件解析
·LINUX KERNEL 配置编译中文指南1
·Linux管理员手册(7)--管理用户帐户
·Linux 2.4 NAT HOWTO
·Java调试教程--Java调试器(JDB)概述
·汉化你的RedHat全攻略(3)- RedHat 7
·linux磁盘管理命令--fdformat
·Linux系统中实现内部进程通信的方法
·Linux系统中网络配置详解
·OO软件设计说明书模板一例
·Python入门(1)
·自己动手制作一张软盘的linux
·JDK开发工具包(一)
·用PHP发送MIME邮件(三)
Power by linux-cn.com 粤ICP备05006655号