免费网站java源码大全 java项目案例分析( 三 )

<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 并发编程实战》

猜你喜欢