<10; i){if (threads[i].getstate() != status[i]) {writeThreadInfo(pw, threads[i], status [i]);status[i] = threads[i].getstate();}}finish =true;for (int i =0; i<10; i) {finish =finish && (threads[i].getstate() ==State. TERMINATED);}}}catch (IOException e){e.printstackTrace();}} 9,在上述代码中,我们通过调用writeThreadInfo()方法来将线程信息记录到文件中 。代码如下:
private static void writeThreadInfo(PrintWriter pw,Thread thread,state state) {pw.printf("Main: Id %d -%sn", thread.getId(),thread.getName());pw.printf("Main: priority:%dn", thread.getPriority());pw.printf ("Main: Old state: %sn", state);pw.printf ("Main: New State: %sn", thread.getstate());pw.printf("Main :***********************************************n");} 10,运行程序,然后观察不同的线程是如何同时运行的 。
结果分析
下图是程序在控制台的输出,从中可以看到,线程正在并行处理各自的工作 。
从下面的屏幕截图中可以看到线程是如何创建的,拥有高优先级的偶数编号线程比低级优先级的奇数编号线程优先执行 。该截图来自记录线程状态的log.tet文件 。
每个Java应用程序都至少有一个执行线程 。在程序启动时, JVM会自动创建执行线程运行程序的main()方法
当调用Thread 对象的start()方法时,JVM才会创建一个执行线程 。也就是说,每个Thread对象的start()方法被调用时,才会创建开始执行的线程 。
Thread类的属性存储了线程所有的信息 。操作系统调度执行器根据线程的优先级,在某个时刻选择一个线程使用CPU ,并且根据线程的具体情况来实现线程的状态 。
如果没有指定线程的名字,那么JVM会自动按照Thread -xx格式为线程命名,其中xx是一个数字 。线程的ID和状态是不可修改的,事实上, Thread类也没有实现setIa()和setstatus()方法,因为它们会引入对ID和状态的修改 。
一个Java程序将在所有线程完成后结束 。初始线程(执行main()方法的线程)完成,其他线程仍会继续执行直到完成 。如果一个程调用system.exit()命令去结束程序,那么所有线程将会止各自的运行 。
创建一个Thread对象并不意味着会创建一个新的执行线程 。同样,调用实现Runnable接口类的run()方法也不会创建新的执行线程 。只有调用了start()方法,一个新的执行线程才会真正创建 。
其他说明
正如本节开头所说,还有另一种创建执行线程的方法——实现一个继承Thread的类,并重写其
run()方法,创建该类的对象后,调用start()方法即可创建执行线程 。
可以使用Thread类的静态方法 currentThread()来获取当前运行线程的Thread对象 。
调用setpriority()方法时,需要对其抛出的IllegalArgumentException 异常进行处理,以防传入的优先级不在合法范围内(1和10之间) 。
本文节选自《Java 9 并发编程实战》
猜你喜欢
- 药品价格315网正规吗 – 好315网是正规网站吗
- 大数据码获取方法 目前开源免费数据库有哪些
- 昆明网站定制 昆明网站优化
- 如何做网站建设方案,网站建设五个基本流程
- 免费查询大数据征信 征信大数据
- 现在免费的创业致富 创业致富的好门路
- 免费手机通话录音软件 电话录音软件
- 免费教你4种分组技巧 微信怎么分组管理好友
- 拼多多砍价网站 拼多多砍价1元10刀网站
- 免费破解pdf加密文件 pdf免费解密方法有什么
