考试首页 | 考试用书 | 培训课程 | 模拟考场 | 考试论坛  
全国  |             |          |          |          |          |         
  当前位置:计算机等级 > 二级考试 > Java语言程序设计 > 考试辅导 > 文章内容
  

计算机二级JAVA考点解析:多线程

中华IT学院   【 】  [ 2017年9月5日 ]

  7.1.3同步

  因为多线程给你提?copy;了程序的异步执行的功能,所以在必要时必须还提?copy;一种同步机制。例如,你想两个线程通讯并共享一个复杂的数据结构,你需要一种机制让他们相互牵制并正确执行。为这个目的,Java用一种叫监视器(monitor)的机制实现了进程间的异步执行。可以将监视器看作是一个很小的盒子,它只能容纳一个线程。一?copy;一个线程进入一个监视器,所有其他线程必须等到第一个线程退出监视器后才能进入。这?copy;监视器可以设计成保护共享的数据不被多个线程同时操作。大多数多线程系统将这?copy;监视器设计成对象,Java提?copy;了一种更清晰的解决方案。没有Monitor类;每个对象通过将他们的成员函数定义成synchronized来定义自己的显式监视器,一?copy;一个线程执行在一个synchronized函数里,其他任何线程都不能调用同一个对象的

  synchronized函数。

  7.1.4消息

  你的程序被分成几个逻辑线程,你必须清晰的知道这?copy;线程?reg;间应怎样相互通讯。Java提了wait和notify等功能来使线程?reg;间相互交谈。一个线程可以进入某一个对象的synchronized函数进入等待状态,直到其他线程显式地将它唤醒。可以有多个线程进入同一个函数并等待同一个唤醒消息。

  7.2Java线程例子

  7.2.1显式定义线程

  在我们的单线程应用程序里,我们并没有看见线程,因为Java能自动创建和控制你的线程。如果你使用了理解Java语言的浏览器,你就已经看到使用多线程的Java程序了。你也许注意到两个小程序可以同时运行,或在你移动滚动条时小程序继续执行。这并不是表明小程序是多线程的,但说明这个浏览器是多线程的。多线程应用程序(或applet)可以使用好几个执行上下文来完成它们的工

  作。多线程利用了很多任务包含单独的可分离的子任务的特点。每一个线程完成一个子任务。但是,每一个线程完成子任务时还是顺序执行的。一个多线程程序允许各个线程尽快执行完它们。这种特点会有更好的实时输入反应。

  7.2.2多线程例子

  下面这个例子创建了三个单独的线程,它们分别打印自己的\"HelloWorld\":

  //Defineoursimplethreads.Theywillpauseforashorttime//andthen

  printouttheirnamesanddelaytimesclassTestThreadextendsThread

  {privateStringwhoami;privateintdelay;

  //Ourconstructortostorethename(whoami)//andtimetosleep(delay)

  publicTestThread(Strings,intd){whoami=s;delay=d;}

  //Run-thethreadmethodsimilartomain()//Whenrunisfinished,the

  threaddies.//Runiscalledfromthestart()methodofThreadpublicvoid

  run(){//Trytosleepforthespecifiedtimetry{sleep(delay);}

  catch(InterruptedExceptione){}//Nowprintoutourname

  System.out.println(\"HelloWorld!\"+whoami+\"\"+delay);}}/***Multimtest.

  Asimplemultithreadthestprogram*/publicclassmultitest{public

  staticvoidmain(Stringargs[]){TestThreadt1,t2,t3;//Createourtest

  threadst1=newTestThread(\"Thread1\",(int)(Math.readom()*2000));t2=

  newTestThread(\"Thread2\",(int)(Math.readom()*2000));t3=new

  TestThread(\"Thread3\",(int)(Math.readom()*2000));

  //Starteachofthethreadst1.start();t2.start();t3.start();}}

  7.2.3启动一个线程

  程序启动时总是调用main()函数,因此main()是我们创建和启动线程的地方:

  t1=newTestThread(\"Thread1\",(int)(Math.readom()*2000));

  这一行创建了一个新的线程。后面的两个参数传递了线程的名称和线程在打印信息?reg;前的延时时间。因为我们直接控制线程,我们必须直接启动它:t1.start();

  7.2.4操作线程

  如果创建线程正常,t1应包含一个有效的执行线程。我们在线程的run()函数里控制线程。一?copy;我们进入run()函数,我们便可执行里面的任何程序。run()好象main()一样。

  run()执行完,这个线程也就结束了。在这个例子里,我们试着延迟一个随机的时间(通过参数传递?)sleep(delay);

  sleep()函数只是简单地告诉线程休息多少个毫秒时间。

  如果你想推迟一个线程的执行,你应使用sleep()函数。当线程睡眠是sleep()并不占用系统资源。其它线程可继续工作。一?copy;延迟时间完毕,它将打印\"HelloWorld\"和线程名称及延迟时间。

  7.2.5暂停一个线程

  我们经常需要挂起一个线程而不指定多少时间。例如,如果你创建了一个含有动画线程的小程序。也许你让用户暂停动画至到他们想恢复为止。你并不想将动画线程仍调,但想让它停止。象这种类似的线程你可用suspend()函数来控制:t1.suspend();这个函数并不永久地停止了线程,你还可用resume()函数重新激活线程:t1.resume();

  7.2.6停止一个线程

  线程的最后一个控制是停止函数stop()。我们用它来停止线程的执行:t1.stop();

  注意:这并没有消灭这个线程,但它停止了线程的执行。并且这个线程不能用t1.start()重新启动。在我们的例子里,我们从来不用显式地停止一个线程。我们只简单地让它执行完而已。很多复杂的线程例子将需要我们控制每一个线程。在这种情况下会使用到stop()函数。如果需要,你可以测试你的线程是否被激活。一个线程已经启动而且没有停止被认为是激活的。t1.isAlive()如果t1是激活的,这个函数将返回true.

分享到:
本文纠错】【告诉好友】【打印此文】【返回顶部
将考试网添加到收藏夹 | 每次上网自动访问考试网 | 复制本页地址,传给QQ/MSN上的好友 | 申请链接 | 意见留言 TOP
关于本站  网站声明  广告服务  联系方式  站内导航  考试论坛
Copyright © 2006-2017 中华考试网(Examw.com) All Rights Reserved  营业执照