java

位置:IT落伍者 >> java >> 浏览文章

获取java线程中信息的两种方法[2]


发布日期:2018年03月25日
 
获取java线程中信息的两种方法[2]

以上是一个多数熟悉单线程编程的人在第一反应下给出的实现方法但是该类在运行的时候输出的结果却不是期望的Hello World!而是Hello这是由于线程的竞争条件导致的(由于ReturnThreadInfo线程和Main线程的优先级都为所以在很大几率上ReturnThreadInfo线程的run()方法还没有运行Main类就已经运行Systemoutprintln(returnThreadInfogetThreadInfo())Hello输出了具体的原理可以参见另一篇文章java多线程的几点误区有的人可能会立即想到把ReturnThreadInfo线程的优先级设高些(比如最大的)就可以returnThreadInfo线程的run()方法先运行完然后Main类的Systemoutprintln(returnThreadInfogetThreadInfo())再运行这样输出的结就一定是期望的Hello World!这种通过调整线程优先级的方法固然可以在某种程度上解决该问题但是线程争用CPU运行时间的原理却决不仅仅只是优先级高低的原因(优先级高的线程并不意味着一定比优先级低的线程先运行只是几率要更大一些)你并不希望ReturnThreadInfo线程次都比Main先运行却在最关键的一次在Main之后再运行因此下面给出两种比较常见的获取线程信息的方法

轮询

比较常见的一种解决方案是让线程类获取方法在结果字段设置之前返回一个标志值然后主线程定时询问获取方法看是否返回了标志之外的值以下给出了具体的实现方法该方法不断测试str的值是否为Hello如果不为Hello才打印输出它例如

package threadtest;

/**

*

* @author shi mingxiang

*/

public class Main{

public Main() {

}

/**

* @param args the command line arguments

*/

public static void main(String[] args) {

ReturnThreadInfo returnThreadInfo = new ReturnThreadInfo();

returnThreadInfostart();//创建并启动ReturnThreadInfo线程

while(true){

String str = returnThreadInfogetThreadInfo();

if(!strequals(Hello)){

Systemoutprintln(returnThreadInfogetThreadInfo());

break;

}

}

}

}

这种方案虽然能起到作用但是它做了大量不需要做的工作事实上还有一种更简单有效的方法来解决这个问题

[] [] []

               

上一篇:获取java线程中信息的两种方法[3]

下一篇:获取java线程中信息的两种方法[1]