问题描述
最近在看<java网络编程>,其中第五章讲到多线程时举得一个例子看不懂,还望大神帮忙看一下。先谢谢啦先贴上代码importjava.io.*;importjava.security.*;importjava.util.*;classReturnDigestextendsThread{privateFileinput;publicReturnDigest(Fileinput){this.input=input;}publicvoidrun(){try{FileInputStreamin=newFileInputStream(input);MessageDigestsha=MessageDigest.getInstance("SHA");DigestInputStreamdin=newDigestInputStream(in,sha);intb;while((b=din.read())!=-1);din.close();byte[]digest=sha.digest();digest=sha.digest();//System.out.println(digest);}catch(IOExceptionex){System.err.println(ex);}catch(NoSuchAlgorithmExceptionex){System.err.println(ex);}}publicbyte[]getDigest(){returndigest;}}publicclassReturnDigestUserInterface{publicstaticvoidmain(String[]args){for(inti=0;i<args.length;i++){Filef=newFile(args[i]);ReturnDigestdr=newReturnDigest(f);dr.start();//显示结果StringBufferresult=newStringBuffer(f.toString());result.append(":");byte[]digest=dr.getDigest();for(intj=0;j<digest.length;j++){result.append(digest[j]+"");}System.out.println(result);}}}
书中给予的解答是这样子的,但是看不懂,为什么dr.start()开始的计算可能会在main()方法运行到dr.getDigest()调用之前结束?
解决方案
本帖最后由 wwxxff28 于 2013-12-01 16:23:10 编辑
解决方案二:
这就是多线程啊,谁先运行完是不一定的
解决方案三:
确切的说是线程的run方法执行结束时间不确定。start方法是告诉jvm,说:“我准备开启一个线程了”。而线程的run方法要依赖os/jvm的调度。你在byte[]digest=dr.getDigest();前加一句dr.join();//这个方法是等待该线程终止。会发现再也不会报错了。
解决方案四:
楼主先看一下多线程运行机制的流程图看一下吧!
解决方案五:
Thread.start()是在主线程里面告诉JVM可以启动新线程的运行了,新线程什么时候被JVM调度和执行完是不确定的。不过可以用一个条件信号量来判断。
解决方案六:
书上的话是对的。线程启动之后运行需要依赖CPU调度。多核和单核的情况还不一样
解决方案七:
引用4楼nj_dobetter的回复:
Thread.start()是在主线程里面告诉JVM可以启动新线程的运行了,新线程什么时候被JVM调度和执行完是不确定的。不过可以用一个条件信号量来判断。
主线程和子线程之间有什么关系?在主线程也就是main()里面创建的子线程dr,我感觉应该是主线程main和子线程的dr的执行顺序已经确定了。如果是在main()中创建多个线程,那么创建的多个线程的执行顺序不定。不知我这种理解是否正确?
解决方案八:
主线程也是个线程,与子线程之间没有必然的先后顺序,与线程在哪里启动的没有关系。线程之间可以互相访问但不是包含关系。
解决方案九:
引用4楼nj_dobetter的回复:
Thread.start()是在主线程里面告诉JVM可以启动新线程的运行了,新线程什么时候被JVM调度和执行完是不确定的。不过可以用一个条件信号量来判断。
谢谢你的回答。提问的问题我已经明白了。但是还有一个问题,JAVA对线程的调度方式是哪种方式?我记得是《JAVA编程思想》上讲的是优先级调度。所有未指定优先级的线程都是同一个优先级。是不是包括主线程main()也是这个优先级?