对JAVA单线程的一点疑惑?

新手老王 2013-12-01 04:21:39
最近在看<java 网络编程>,其中第五章讲到多线程时举得一个例子看不懂,还望大神帮忙看一下。先谢谢啦
先贴上代码
import java.io.*;
import java.security.*;
import java.util.*;

class ReturnDigest extends Thread
{
private File input;
public ReturnDigest(File input)
{
this.input =input;
}

public void run()
{
try
{
FileInputStream in = new FileInputStream(input);
MessageDigest sha = MessageDigest.getInstance ("SHA");
DigestInputStream din = new DigestInputStream(in,sha);
int b;
while((b = din.read())!=-1);
din.close();
byte[] digest = sha.digest();

digest = sha.digest();
//System.out.println( digest );
}
catch (IOException ex)
{
System.err.println(ex);
}
catch (NoSuchAlgorithmException ex)
{
System.err.println(ex);
}
}

public byte[] getDigest()
{
return digest;
}
}

public class ReturnDigestUserInterface
{
public static void main(String[] args)
{
for (int i=0 ; i<args.length ; i++ )
{
File f = new File(args[i]);
ReturnDigest dr = new Return Digest(f);
dr.start();

//显示结果
StringBuffer result = new StringBuffer (f.toString());
result.append(": ");
byte[] digest = dr.getDigest();
for( int j =0 ;j <digest.length; j++)
{
result.append (digest[j]+" ");
}
System.out.println(result);
}
}
}

书中给予的解答是这样子的,但是看不懂,为什么dr.start()开始的计算可能会在main()方法运行到dr.getDigest()调用之前结束?
...全文
648 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
新手老王 2013-12-02
  • 打赏
  • 举报
回复
引用 4 楼 nj_dobetter 的回复:
Thread.start()是在主线程里面告诉JVM可以启动新线程的运行了,新线程什么时候被JVM调度和执行完是不确定的。不过可以用一个条件信号量来判断。
谢谢你的回答。提问的问题我已经明白了。但是还有一个问题,JAVA对线程的调度方式是哪种方式?我记得是《JAVA编程思想》上讲的是优先级调度。所有未指定优先级的线程都是同一个优先级。是不是包括主线程main()也是这个优先级?
jdgdf566 2013-12-02
  • 打赏
  • 举报
回复
主线程也是个线程,与子线程之间没有必然的先后顺序,与线程在哪里启动的没有关系。线程之间可以互相访问但不是包含关系。
新手老王 2013-12-02
  • 打赏
  • 举报
回复
引用 4 楼 nj_dobetter 的回复:
Thread.start()是在主线程里面告诉JVM可以启动新线程的运行了,新线程什么时候被JVM调度和执行完是不确定的。不过可以用一个条件信号量来判断。
主线程和子线程之间有什么关系?在主线程也就是main()里面创建的子线程 dr ,我感觉应该是主线程main和子线程的dr的执行顺序已经确定了。如果是在main()中创建多个线程,那么创建的多个线程的执行顺序不定。不知我这种理解是否正确?
teemai 2013-12-02
  • 打赏
  • 举报
回复
书上的话是对的。线程启动之后运行需要依赖CPU调度。多核和单核的情况还不一样
nj_dobetter 2013-12-02
  • 打赏
  • 举报
回复
Thread.start()是在主线程里面告诉JVM可以启动新线程的运行了,新线程什么时候被JVM调度和执行完是不确定的。不过可以用一个条件信号量来判断。
ganshenml 2013-12-01
  • 打赏
  • 举报
回复
楼主先看一下多线程运行机制的流程图看一下吧!
poooll 2013-12-01
  • 打赏
  • 举报
回复
确切的说是线程的run方法执行结束时间不确定。start方法是告诉jvm,说:“我准备开启一个线程了”。 而线程的run方法要依赖os/jvm的调度。 你在byte[] digest = dr.getDigest();前加一句 dr.join(); // 这个方法是等待该线程终止。 会发现再也不会报错了。
WayneXuan 2013-12-01
  • 打赏
  • 举报
回复
这就是多线程啊,谁先运行完是不一定的

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧