⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java入门(13).htm

📁 JAVA入门  很好的学习JAVA的资料 很适合初学者
💻 HTM
📖 第 1 页 / 共 5 页
字号:
      <BR>public synchronized void paint(Graphics g) <BR>{ <BR>g.setColor 
      (Color.black); <BR>g.drawLine 0,getSize().height/2, 
      <BR>getSize().width,getSize().height/2); <BR>g.setColor (Color.yellow); 
      <BR>g.fillOval((myPosition*getSize().width/numberofSteps),0, 
      <BR>15,getSize().height); <BR>} <BR>public void stop() <BR>{ 
      <BR>keepRunning = false; <BR>} <BR>public void run() <BR>{ <BR>while 
      ((myPosition <BR><BR><BR>  输入完成以后,执行以下命令编译: <BR><BR><BR>javac 
      testThread.java Threader.java <BR><BR><BR><BR>  然后,我们再执行命令: 
      <BR><BR><BR>java testThread <BR><BR><BR><BR>  程序的输出如下图所示: 
      <BR><BR><BR>  图13-17 程序testThread.java的输出 
      <BR><BR>  你看,三个人在赛跑!看谁快,他们太接近了,谁是第一名呢?所以我们来看看在DOS窗口的输出: 
      <BR><BR><BR>  图13-18 MS-DOS下的输出 
      <BR><BR>  我们看到,程序的输出给出了公正的判决。第一次赛跑(第一次运行这个程序),冠军是第三道(Racer #2),第一道(Racer 
      #0)屈居第二,第二道(Racer 
      #1)是最后一名。第二次赛跑时,第二道反而成为了第一名。我们再运行几次程序,就会发现每一次的成绩都可能不同。你来可以使用以下命令来让更多的“人”参加赛跑: 
      <BR><BR><BR>java testThread 5 <BR><BR><BR><BR>  传授新知 
      <BR><BR>  这个程序太庞大了,也许会把大家吓倒!我们来看一下这个程序结构。这个示例由两个文件组成:testThread.java和Threader.java。 
      <BR><BR>  其中,Threader中定义了竞赛者对象,我们先一起来看一下这个类: <BR><BR>  1) 
      <BR><BR><BR>public Threader (String inName) <BR>{ <BR>myName=new String 
      (inName); <BR>} <BR><BR><BR><BR>  这是类Threader中构造器方法,它为Threader设置对象名。 
      <BR><BR>  2) <BR><BR><BR>public synchronized void paint(Graphics g) <BR>{ 
      <BR>g.setColor (Color.black); <BR>g.drawLine 
      (0,getSize().height/2,getSize().width, <BR>getSize().height/2); 
      <BR>g.setColor (Color.yellow); 
      <BR>g.fillOval((myPosition*getSize().width/numberofSteps),0, 
      <BR>15,getSize().height); <BR>} 
      <BR><BR><BR><BR>  我们为Threader类定义了一个paint方法,我们看一下这个方法做了些什么: 
      <BR><BR>  前两条语句用来画出这个竞赛者(Threader)的赛道,一条黑色的赛道!这条赛道用一根线来表示:它从(0,getSize().height/2)到(getSize().width,getSize().height/2)。也就是一个从最左边到最右边的,位于中心的黑线。 
      <BR><BR>  然后,我们画出这个竞赛者,它用一个黄色的椭圆来表示。这个椭圆宽15,高为整个格子,位置由变量myPosition决定。 
      <BR><BR>  一些提示: 
      <BR><BR>  我们将myPosition的初值设置为0.将整个赛道分成numberofSteps步,即600步。MyPosition每加1,就走过一步。 
      <BR><BR>  2) <BR><BR><BR>public void run() { <BR>while ((myPosition 
      <BR><BR><BR>  这是一个while循环,当myposition小于numberofSteps,就将myposition加1(往前走一步),然后重画(这样这一步就会显示出来)。 
      <BR><BR>  如果myposition=numberofSteps时,意味着什么?对,意味着走完了赛程,因此,打印出完成信息。 
      <BR><BR>  大家看到,我们重画后,我们使用了这样一条语句: 
      <BR><BR><BR>Thread.currentThread().sleep(10); 
      <BR><BR><BR><BR>  这是让当前线程进入休眠状态一小会(10个时间周期)。这是为什么呢?要理解这个问题,我们需要学习一下CPU是如何管理这些线程的。线程与进程一样有三种状态: 
      <BR><BR>  § 运行态:线程正在运行; <BR><BR>  § 就绪态:线程一切就绪,可以运行,正在等待CPU运行; <BR><BR>  § 
      阻塞态:线程未准备就绪,正在等待某个条件。 <BR><BR>  其间的关系,如下图所示: <BR><BR><BR>  图13-19 线程状态转换图 
      <BR><BR>  由于在单处理器的系统中,一个时间内CPU只能运行一个线程。所以如果我们在每个竞赛者跑一步时,就让它休眠(进入阻塞态,等待休眠时间到),这样就不会让一个线程一直占用CPU,以免不公平嘛! 
      <BR><BR>  由于我们让线程的休眠时间比较短,所以一会就回到了,这时线程就进入就绪态,等待CPU有时间的时候运行。CPU呢一有时间,就从就绪的线程中选择一个来运行。 
      <BR><BR>  大家看到这里,可能早已昏头转向了,下面我们举一个生活中的例子来模拟一下这个情况:有三位职员(对应程序中的三个竞赛者、即三个线程)要向经理(对应运行线程的CPU)汇报工作。但这个经理采用了一个十分公平的方法(当然在现实生活中是不可能的)来接受三个职员的汇报。也就是每一个职员一次只说一句话(每一个竞赛者跑一步),然后就呆一边休息一下(休眠10个时间周期),然后从另两个职员中任选一个来说(选择就绪的线程)。也是说一句话,就让他休息。这样周而复始,直到他们都汇报完毕。 
      <BR><BR>  情况如下图所示: <BR><BR><BR>  图13-20 竞赛者线程示意图 <BR><BR>  一些提示: 
      <BR><BR>  以上所述的关于线程的描述,是基于支持多线程的系统。如果不支持多线程的话,这是不成立的。在不支持线程的系统中,则将线程改成进程就行了。 
      <BR><BR>  接下来,我们看一下testThread.java程序,这才是我们执行时的主体部分: <BR><BR>  3) 
      <BR><BR><BR>public static void main (String argv[]) <BR>{ 
      <BR>inApplet=false; <BR>if (argv.length&gt;0) <BR>racerCount = 
      Integer.parseInt(argv[0]); <BR>Frame theFrame = new Frame("The Great 
      Thread Race"); <BR>testThread theRace = new testThread(); 
      <BR>theFrame.setSize(400,200); <BR>theFrame.add ("Center",theRace); 
      <BR>theFrame.show(); <BR>theRace.init(); <BR>theFrame.pack(); 
      <BR>theRace.start(); <BR>} 
      <BR><BR><BR><BR>  这个程序执行时,首先将运行这个main方法。然后通过判断argv.length是否大于0,如果大于0,就将执行时所带的参数赋给racerCount(参赛人数),否则就为3(在程序的开始处有定义。 
      <BR><BR>  然后创建一个Frame,然后调用init()和start()方法。 <BR><BR>  一些提示: 
      <BR><BR>  注意,在这里我们创建一个testThread类的对象theRace,通过它来调用。 <BR><BR>  4) 
      <BR><BR><BR>for (int x=0;x 
      <BR><BR><BR>  在theRace的init()方法中,最主要的部分就是这个for循环。通过这个循环我们创建了racerCount个Threader(竞赛者),并将它们命名为“Racer 
      #x”,然后设置它的高度(整个Frame的高度/竞赛者数)。最后调用Frame的add方法将它们显示出来。 
      <BR><BR>  然后为每一个竞赛者(Threader)创建一个线程Thread。也就是说为每一个竞赛者创建一个线程,用这个线程来控制它。 
      <BR><BR>  一切就绪之后,我们就要开始“赛跑”了。 <BR><BR>  5) <BR><BR><BR>public void start() 
      <BR>{ <BR>for (int x=0;x 
      <BR><BR><BR>  接下来,我们调用了theRace的start()方法,我们看到在这个方法中,我将启动了“控制”所有参赛者的线程。(调用Thread的start方法) 
      <BR><BR>  多线程编程是相当复杂的,本书中仅给大家整理一下思路,做一些简要的介绍,大家可以阅读一些更高级的Java书籍,来更深入地学习。 
      <BR><BR>  自测练习 <BR><BR>  1) 以下关于进程的说法中,____________是正确的。 <BR><BR>  a.就是程序 
      b.一个运行中的程序 c.由线程组成 <BR><BR>  2) 以下关于线程的说法中,____________是正确的。 
      <BR><BR>  a.是一种轻量线进程 b.一个进程中只能有一个线程 <BR><BR>  c.每个线程都有自己的地址空间 <BR><BR>  3) 
      Java语言中有两种方法实现多线程,它们是__________、 ____________。 <BR><BR>  a.继承Thread类 
      b.继承Threader类 <BR><BR>  c.使用Runnable接口 d.使用Thread接口 <BR><BR>  4) 
      最常使用的多线程实现方法是__________。 <BR><BR>  a.继承Thread类 b.继承Threader类 
      <BR><BR>  c.使用Runnable接口 d.使用Thread接口 <BR><BR>  请说明理由: 
      <BR><BR>  ____________________________________________________________________ 
      <BR><BR>  ____________________________________________________________________ 
      <BR><BR>  5) ___________不属于线程的状态: <BR><BR>  a.运行态 b.完成态 c.就绪态 d.阻塞态 
      <BR><BR>  6) 请描述出使用Runnable接口实现多线程的步骤: 
      <BR><BR>  ____________________________________________________________________ 
      <BR><BR>  ____________________________________________________________________ 
      <BR><BR>  ____________________________________________________________________ 
      <BR><BR>  7) 如果我们使用java testThread a来执行这个程序的话,就会出错,请问这是为什么?请说明: 
      <BR><BR>  ____________________________________________________________________ 
      <BR><BR>  ____________________________________________________________________ 
      <BR><BR>  练习答案 <BR><BR>  1)b 并不是所有的进程都是由多个线程组成的。进程是程序的一个运行实例,它与程序是不等价的。 
      <BR><BR>  2)a 
      在支持线程的系统中,我们可以在一个进程中细分出多个线程,但并不是说每一个进程中都有多个线程。在一个进程中的线程是共享地址空间的。线程,也称为轻量级进程。 
      <BR><BR>  3)a、c 有两种方法,分别是继承Thread类,以及使用Runnable接口。 <BR><BR>  4)c 
      最常用的方法是使用Runnable接口。 
      <BR><BR>  这是因为,我们经常需要继承其它类,而Java又不支持多重继承,所以使用继承Thread类有很大的局限性。 
      <BR><BR>  5)b 当一个线程完成后,就释放了,并不存在一个完成态。 <BR><BR>  6)第一步:在类的定义后加上implements 
      Runnable,以使用Runnable接口;第二步:重写定义一个run()方法,定义线程要做的事情。 
      <BR><BR>  7)将会出错。这是因为我们希望参数是竞赛者的人数,也就是需要整型数,而不是字符型。如果输入字符型就会造成程序出错。 
      <BR><BR>  13.4 JavaBeans <BR><BR>  13.4.1 什么是组件(部件)技术 <BR><BR>  传授新知 
      <BR><BR>  通常,我们开发一个应用软件时,都是事先经过需求分析、设计,然后开发出所需的软件。在这个软件系统中,各种功能、特性用固定的方法联系在一起。但是,软件的组成部分大多无法独立地删除、升级。 
      <BR><BR>  这样造成的结果就是,不同的应用程序即使用同一种编程语言,在同一台机器上使用,也无法互相利用,它们之间就象是陌路人一样。 
      <BR><BR>  另外,由于操作系统不同,使得在不同的操作系统上完成一个相同的工作,往往实现的方法也就不同。尽管,国际上有许多标准化组织制定了许多规范来减少各个操作系统的开发接口的不同,但是这也只能够是一个权宜之计。 
      <BR><BR>  但是随着应用的不断扩展,经常需要让那些基于不同设计的软件交互,甚至一起工作。传统的方法是通过一组系统服务API(Application 
      Programe Interface,应用编程接口)来实现。其工作原理如下图所示: <BR><BR><BR>  图13-21 
      通过API来利用原来的程序功能 
      <BR><BR>  通常会提供API的,都是一些系统软件,它们本身在设计时就充分考虑到让其它用户程序通过API来调用自身的“功能”模块。而如果一个软件本身在设计时并未考虑到API的话,就无法使用这种方法来实现,因此这种模式有极大的局限性。 
      <BR><BR>  矛盾与需求必将促进技术的发展。在20世纪90年代,出现了一种基于面向对象技术的软件工程技术---组件技术。这是一个新一代软件技术发展的里程碑。 
      <BR><BR>  一些提示: 
      <BR><BR>  面向对象技术是出现在20世纪80年代,但它并未完全解决我们遇到的问题。因为经缺乏一种让不同开发商提供的软件对象在同一地址空间里相互合作的机制。 
      <BR><BR>  这些有用的对象就象是“千军万马”,但我们还缺少一个能够“统帅三军”的人物。而组件技术就是这个“统帅”。 
      <BR><BR>  组件技术的基本思想就是:创建和利用可复用的软件组件来解决应用软件的开发问题。组件是一种可复用的一小段软件(可以是二进制的,而不是源代码)。组件可以有多种多类,小到图形界面上的一个按钮,大到一个复杂的软件。 
      <BR><BR>  只要开发者、应用商将它们的软件作品组件化,那么程序员们就可以在这些组件的基础上,根据自己的需要,将不同语言、不同厂商的组件组合在一起,编制自己的应用程序。通过复用这些组件,就能够使应用程序开发变得更加简单、更加快速,而且成本更加低廉。 
      <BR><BR>  组件技术的出现,使得: <BR><BR>  1) 
      大大提高开发速度:由于许多软件模块都是通过复用这些已用的软件组件而成,因此将大大减少开发量,缩短开发周期。 <BR><BR>  2) 
      降低开发成本:开发量的减少,开发周期的缩短,都会节约大量的成本。 <BR><BR>  3) 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -