专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » java多线程:获取java线程中信息的两种思路方法 »正文

java多线程:获取java线程中信息的两种思路方法

来源: 发布时间:星期三, 2008年12月17日 浏览:67次 评论:0
在进行多线程编程中比较重要也是比较困难个操作就是如何获取线程中信息大多数人会采取比较常见种思路方法就是将线程中要返回结果存储在个字段中然后再提供个获取思路方法将这个字段内容返回给该思路方法如以下ReturnThreadInfo类: package threadtest1;
/**
 *
 * @author shi mingxiang
 */
public ReturnThreadInfo extends Thread {
    private String str;
   
    public ReturnThreadInfo {
        this.str = "Hello";
    }
   
    public void run{
            this.str = "Hello World!";
    }
   
    public String getThreadInfo{
        this.str;
    }
}
  大家可以看到该类是个线程类并含有值为"Hello"字段str以及个可以返回str值思路方法:getThreadInfo而且当这个线程启动后str会被赋于新值:"Hello World!"现在我想在另外个类中启动ReturnThreadInfo线程并通过getThreadInfo思路方法获取值为"Hello World!"变量并打印输出到控制台中以下给出个实现该功能Main类:

package threadtest1;
/**
 *
 * @author shi mingxiang
 */
public Main{
   
    public Main {
    }
   
    /**
     * @param args the command line arguments
     */
    public void (String args) {
        ReturnThreadInfo ThreadInfo = ReturnThreadInfo;
        ThreadInfo.start;  //创建并启动ReturnThreadInfo线程
        .out.prln(ThreadInfo.getThreadInfo);  //获取并输出ThreadInfo对象str值    
    }
   
}
  以上是个多数熟悉单线程编程人在第反应下给出实现思路方法但是该类在运行时候输出结果却不是期望"Hello World!"而是"Hello"这是由于线程竞争条件导致(由于ReturnThreadInfo线程和Main线程优先级都为5所以在很大几率上ReturnThreadInfo线程run思路方法还没有运行Main类就已经运行.out.prln(ThreadInfo.getThreadInfo);将"Hello"输出了具体原理可以参见另篇文章:"java多线程几点误区")人可能会立即想到把ReturnThreadInfo线程优先级设高些(比如最大10)就可以ThreadInfo线程run思路方法先运行完然后Main类.out.prln(ThreadInfo.getThreadInfo)再运行这样输出结就定是期望"Hello World!"了这种通过调整线程优先级思路方法固然可以在某种程度上解决该问题但是线程争用CPU运行时间原理却决不仅仅只是优先级高低原因(优先级高线程并不意味着定比优先级低线程先运行只是几率要更大些)你并不希望ReturnThreadInfo线程9999次都比Main先运行却在最关键次在Main的后再运行因此下面给出两种比较常见获取线程信息思路方法:
、轮询
  比较常见种解决方案是让线程类获取思路方法在结果字段设置的前返回个标志值然后主线程定时询问获取思路方法看是否返回了标志的外以下给出了具体实现思路方法该思路方法不断测试str值是否为"Hello"如果不为"Hello"才打印输出它例如:

package threadtest1;
/**
 *
 * @author shi mingxiang
 */
public Main{
   
    public Main {
    }
   
    /**
     * @param args the command line arguments
     */
    public void (String args) {
        ReturnThreadInfo ThreadInfo = ReturnThreadInfo;
        ThreadInfo.start;  //创建并启动ReturnThreadInfo线程

        while(true){
            String str = ThreadInfo.getThreadInfo;
            (!str.equals("Hello")){
                 .out.prln(ThreadInfo.getThreadInfo);
                 ;
            }
        }    
    }
}
  这种方案虽然能起到作用但是它做了大量不需要做工作事实上还有种更简单有效思路方法来解决这个问题

2、回调
  轮询思路方法最大特点是主类Main不断询问线程类是否结束这实际上大量浪费了运行时间特别是当线程特别多时候因此如果反过来在线程结束时由线程自己告诉主类Main线程已经结束然后Main再获取并输出str这样就避免了轮询思路方法所带来不必要系统开销问题
  在具体实现过程中线程可以在结束时通过主类中个思路方法来实现告知功能这种思路方法叫做回调这样主类Main就可以在等待线程结束时休息也就不会占用运行线程时间下面是修改后Main类:
public Main{
   
    public Main {
    }
   
    /**
     * @param args the command line arguments
     */
    public void (String args) {
        // TODO code application logic here
        ReturnThreadInfo ThreadInfo = ReturnThreadInfo;
        ThreadInfo.start;
    }
   
    public void receiveStr(String str){
        .out.prln(str);
    }
}
  相比于前面我们在Main类中添加了个静态思路方法receiveStr(String str)该思路方法是供线程结束的前通过参数str将要返回线程信息返回给Main类并输出显示出来下面是修改后ReturnThreadInfo类该类在线程结束前回调了Main.receiveStr思路方法通知线程已结束

package threadtest1;
/**
 *
 * @author shi mingxiang
 */
public ReturnThreadInfo extends Thread {
    private String str;
   
    public ReturnThreadInfo {
        this.str = "Hello";
    }
   
    public void run{
            this.str = "Hello World!";
     Main.receiveStr(str); //回调receiveStr思路方法
    }
}

  如果有很多个对象关心线程返回信息,线程可以保存个回调对象列表某个对象可以通过已经定义个对象将自己添加到列表中表示自己对这些信息关注如果有多个类例子关心这些信息也可以定义erfaceerface中声名回调思路方法然后这些类都实现这个接口其实这是典型java处理事件思路方法这么做可以使得回调更灵活可以处理涉及更多线程、对象和类情况稍后会给出这种模仿事件处理模型回调实现思路方法

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: