对JAVA单线程的一点疑惑?

问题描述

最近在看<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()也是这个优先级?

时间: 2024-08-04 12:28:38

对JAVA单线程的一点疑惑?的相关文章

java socket的一点疑惑

问题描述 今天看了看javasocket,发现了一点疑惑的问题,因为javasocket这块儿接触的比较少,所以求大神来帮忙.1.java在创建一个socketserver的时候可以传入一个ip地址,这个地址如果不是你本机的地址会出现什么情况?2.看代码注释CreatesasocketaddresswheretheIPaddressisthewildcardaddressandtheportnumberaspecifiedvalue.这里面wildcardaddress又是什么意思,中文解释为通

Java函数调用的一点疑惑,求Java大神解答

问题描述 在Java,如果有两个函数如下:voidf(Integeri){}voidf(Floatf){} 如果调用f(1),JVM知道去调用第一个函数但是如果换成是下面两个函数voidf(Integer...args){}voidf(Float...args){} 这时如果调用f(1),javac爆函数歧义但是如果再次换成下面两个函数voidf(Integer...args){}voidf(Object..args){} 这时调用f(1),就可以正常调用第一个函数或者换成下面两个函数voidf

JUC中Atomic class之lazySet的一点疑惑

JUC中Atomic class之lazySet的一点疑惑 最近再次翻netty和disrupt的源码, 发现一些地方使用AtomicXXX.lazySet()/unsafe.putOrderedXXX系列, 以前一直没有注意lazySet这个方法, 仔细研究一下发现很有意思.我们拿AtomicReferenceFieldUpdater的set()和lazySet()作比较, 其他AtomicXXX类和这个类似. public void set(T obj, V newValue) { // .

ie兼容-关于IE条件语句的一点疑惑

问题描述 关于IE条件语句的一点疑惑 经常在网站头部看到类似于这样的IE条件注释: <!--[if IE 7 ]><html lang=""zh"" id=""ne_wrap"" class=""no-js ie7""><![endif]--> 虽然能够理解该注释语法:在浏览器版本为ie7时,应用该代码,非ie浏览器则只把其当做一条注释而忽略掉.但不太

简单的学习了java之后,有些疑惑到底用做些什么最方便

问题描述 简单的学习了java之后,有些疑惑到底用做些什么最方便 我知道java可以跨平台,有时我想写一个windows程序,但是又要打包,所以我感觉这个不是 开发windows的最佳选择,那么,这个语言开发什么是最合适的,我知道安卓使用他开发的 那其他的呢 解决方案 windows桌面程序,当然用微软自己的开发工具,比如VC++和C#最好. android.基于jsp的网站用java 解决方案二: 网站:Taobao.支付宝网站是基于Java的.京东商城也是基于Java的. 系统:各种系统.

线程安全-委托的一点疑惑。为何此处仍然报线程不安全的异常【图】

问题描述 委托的一点疑惑.为何此处仍然报线程不安全的异常[图] 我对委托的理解是一个函数指针,将某个方法的指针交给一个委托,然后由委托根据指针找到创建方法的线程去安全的调用方法. 疑问1:异步委托是否新开线程了. 疑问2: 当用子线程更新主线程控件状态时考虑到线程安全性一般都这样做. 1 ***某线程的方法里*** 2 3 this.Invoke(New Action(()=>{ 4 lable1.Text="111"; 5 })); 6 7 ***某线程的方法里*** 在win

ios-iOS的GCD中的一点疑惑,求大神详解

问题描述 iOS的GCD中的一点疑惑,求大神详解 dispatch_queue_create(""队列名"",0),这个队列名有什么作为,创几个线程这个队列名,不管一样不一样,作用都一样 解决方案 ios-GCD详解iOS-GCD多线程编程详解5IOS GCD的使用详解

关于gcc和g++编译c文件时的一点疑惑

问题描述 关于gcc和g++编译c文件时的一点疑惑 普遍观点,gcc把c文件当做c处理,把c++当做c++处理:而g++把二者都当做c++处理.这里的处理是指语法分析那一步. 但g++在编译过程中调用了gcc.我疑惑了,语法分析是编译的第二步吧,既然g++调用了gcc,那么它是怎么让gcc把c文件当做c++处理的. 还有一点,就是对于c文件编译出来的符号,使用gcc和g++到底一不一样.比如在c文件里定义int add(int a,int b):用gcc和g++最后编译出来的符号到底是什么?是c

commonjs-关于CommonJS和AMD的一点疑惑

问题描述 关于CommonJS和AMD的一点疑惑 1.AMD规范是否是CommonJS的真子集?2.CommonJS是同步的还是异步的,还是两者都支持?3.RequireJS当用CommonJS格式书写define()方法时,module参数有何作用?exports呢?module.exprots与exprots又有何分别?可否混用?4.RequireJS的define()方法写成define( function( require exports module) { ... })时,匿名函数里的