|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你通过从书的数量和开发周期及运行速度来证明:net和ruby要比java简单。
之前讲到Thread的创立,那是Thread性命周期的第一步,厥后就是经由过程start()办法来启动Thread,它会实行一些外部的办理事情然后挪用Thread的run()办法,此时该Thread就是alive(活泼)的,并且我们还能够通过isAlive()办法来断定该线程是不是启动仍是闭幕。
一旦启动Thread后,我们就只能实行一个方法:run(),而run()办法就是卖力实行Thread的义务,以是闭幕Thread的办法很复杂,就是闭幕run()办法。仔细检察文档,我们会发明内里有一个办法:stop(),仿佛能够用来中断Thread,可是这个办法已被取销了,由于它存在着外部的合作。
我们常常必要一个不休实行的Thread,然后在某个特定的前提下才会闭幕它,办法有良多,但最经常使用的有设定标志和中止Thread两种体例。
我们将之前例子中的Thread改写一下:- publicclassRandomCharacterGeneratorextendsThreadimplementsCharacterSource{
- staticchar[]chars;
- staticStringcharArray="abcdefghijklmnopqrstuvwxyz0123456789";
- static{
- chars=charArray.toCharArray();
- }
- privatevolatilebooleandone=false;
- Randomrandom;
- CharacterEventHandlerhandler;
- publicRandomCharacterGenerator(){
- random=newRandom();
- handler=newCharacterEventHandler();
- }
- publicintgetPauseTime(){
- return(int)(Math.max(1000,5000*random.nextDouble()));
- }
- @Override
- publicvoidaddCharacterListener(CharacterListenercl){
- handler.addCharacterListener(cl);
- }
- @Override
- publicvoidremoveCharacterListener(CharacterListenercl){
- handler.removeCharacterListener(cl);
- }
- @Override
- publicvoidnextCharacter(){
- handler.fireNewCharacter(this,
- (int)chars[random.nextInt(chars.length)]);
- }
- publicvoidrun(){
- while(!done){
- nextCharacter();
- try{
- Thread.sleep(getPauseTime());
- }catch(InterruptedExceptionie){
- return;
- }
- }
- }
- publicvoidsetDone(){
- done=true;
- }
- }
复制代码 如今我们多了一个标志:done,如许我们就能够在代码中经由过程挪用setDone()来决意甚么时分中断该Thread。这里利用了volatile关头字,它次要是为了同步。这点会放在同步这里讲。
设定标志的最年夜问题就是我们必需守候标志的形态,如许就会形成提早。固然,这类提早是没法制止的,但必需想举措延长到最小。因而,中止Thread这类办法就有它的发扬中央了。
我们能够经由过程interrupt()办法来中止Thread,该办法会形成两个反作用:
1.它会招致任何的堵塞办法城市抛出InterruptedException,我们必需强制性的捕捉这个毛病哪怕我们基本就不必要处置它,这也是java的非常处置机制让人诟病的一个中央。
2.设定Thread对象外部的标志来唆使此Thread已被中止了,像是如许:- publicvoidrun
- (){
- while(!isInterrupted()){
- ...
- }
- }
复制代码 固然没法制止提早,可是提早已被延长了。
不管是接纳标志仍是中止的办法,我们之以是无法打消提早的缘故原由是我们没法断定是反省标志先仍是挪用办法先,这就是所谓的racecondition,是线程处置中永久没法制止的话题。
Thread不但能够被闭幕,还能够停息,挂起和恢复。
Thread底本有suspend()办法和resume()办法来实行挂起和恢复,但它们和stop()出于一样的缘故原由,都被取销了。
我们能够经由过程sleep()办法来挂起Thread,当在指定的工夫后,它就会主动恢复。严厉意义上讲,sleep其实不同等于suspend,真实的suspend应当是由一个线程来挂起另外一个线程,可是sleep只会影响以后的Thread。要想真正完成挂起和恢复,我们可使用守候和关照机制,但这个机制最年夜的成绩就是我们的Thread必需利用该手艺来编写。
Thread在闭幕后,假如有大概,我们还必要对它举行善后。即便Thread已被闭幕了,可是其他对象只需还持有它的援用,它们就能够挪用该Thread的资本,这也会招致该Thread没法被接纳。
但我们偶然候仍是但愿持续坚持该Thread的援用,由于我们想要辨别它是不是真的已完成了事情,可使用join()办法。join()办法会被堵塞住直到Thread完成它的run()办法,可是这个存在风险:第一次对join()方法的挪用大概会一向被堵塞住很长工夫直到Thread真正完成,以是,一样平常情形下我们仍是利用isAlive()办法来判别。
因为我们能够经由过程完成一个Runnable接口来界说我们的义务,以是在判别地点线程是不是已中止的时分,就有一个成绩:该义务还没有绑定就任何线程上。我们能够经由过程currentThread()办法来取得当前Thread的援用,接着挪用isInterrupted()来判别线程是不是中止。
恰恰证明了java的简单,要不怎么没有通过c/c++来搞个这种框架? |
|