您的位置:首页 > 其它

如何获取算法运行状态

2015-09-24 09:29 232 查看
  最近在学习过程中遇到了这个问题:如何获取算法的执行状态?

  当时遇到这个问题时,整个人都不好了:算法都还没接触过,更不要说获取算法运行的状态了!

  自己想了很久还是没想出来,今天突然回想起师兄说的那个例子:在AWT编程中,一个界面有那么多按钮,程序是如何知道你点击的是哪个按钮的呢?

  我想了下从点击到反馈这个过程:首先我给这个按钮注册了监听器,每当我点击这个按钮的时候系统会自动生成一个事件,然后传给在该监听器中相应的方法。

  突然感觉获取算法运行状态和这个差不多啊!

  我又类比了一下AWT中的事件源、事件和事件处理器(监听器):事件源相当于算法本身、事件相当于算法执行到某一步、事件处理器——自己定义一个监听器。

 

  思路一下就明了了:给算法添加一个监听器属性,通过这个监听器给调用者一个反馈!

  步骤大概是这样的:

  1、定义一个监听器接口,有两个地方用到:在算法运行入口的那个类(如本例的MyProcess)要实现这个接口;算法内部要有监听器这个属性,以便调用监听器的回调方法。

  2、算法(事件源)要有一个addListener()这个方法,用于注册监听器。

  3、在算法运行入口的那个类中(本例为MyProcess)调用算法的addListener(this)方法,参数为this,将自己传入算法中。此时监听器已经注册完成。

  4、剩下的事情就是算法的实现者考虑的事了:需要在哪些地方触发事件,将状态反馈给调用者。

   

  伪UML图:

 

         


  

1 package com.tony.Listener;
2
3 public interface MyListener {
4
5     /**
6      * 回调函数,在事件源中被调用
7      * @param e 事件
8      */
9     public void callBack(MyEvent e);
10 }


 

1 package com.tony.Listener;
2
3 /**
4  *
5  * 自定义的事件类
6  */
7 public class MyEvent {
8
9     private String content;
10
11     public MyEvent(){
12     }
13
14     /**
15      * 更新信息
16      * @param content 内容
17      */
18     public void setContent(String content){
19         this.content = content;
20     }
21
22     public String getContent(){
23         return content;
24     }
25 }


 

1 package com.tony.Listener;
2
3 public class MyAlgorithm {
4
5     private MyListener listener;
6
7     public MyAlgorithm(){
8     }
9
10     /**
11      * 注册监听器
12      * @param listener 监听器
13      */
14     public void addListener(MyListener listener){
15         this.listener = listener;
16     }
17
18     /**
19      * 模拟算法执行
20      */
21     public void start(){
22         MyEvent event = new MyEvent();
23         for(int i = 0;i < 1000;i++){
24             if(i%100 == 0){
25                 event.setContent("算法执行到第:"+i+" 步");
26                 listener.callBack(event);
27             }
28         }
29         event.setContent("算法执行完毕!");
30         listener.callBack(event);
31     }
32
33 }

 

 

 1 package com.tony.Listener;
2
3 /**
4  *
5  * 算法执行入口
6  */
7 public class MyProcess implements MyListener{
8
9     private MyAlgorithm algorithm;
10
11     @Override
12     public void callBack(MyEvent e) {
13         System.out.println(e.getContent());
14     }
15
16     public MyProcess(){
17         algorithm = new MyAlgorithm();
18         //注册监听器
19         algorithm.addListener(this);
20     }
21
22     public void start(){
23         algorithm.start();
24     }
25
26     public static void main(String[] args){
27         MyProcess process = new MyProcess();
28         process.start();
29     }
30
31 }


 

   控制台打印结果:

1 算法执行到第:0 步
2 算法执行到第:100 步
3 算法执行到第:200 步
4 算法执行到第:300 步
5 算法执行到第:400 步
6 算法执行到第:500 步
7 算法执行到第:600 步
8 算法执行到第:700 步
9 算法执行到第:800 步
10 算法执行到第:900 步
11 算法执行完毕!


 

 

  这种方式不仅能监听算法执行状态以外,还可以监听其它类似程序运行状态,只要相应的改一下事件源和事件:

  在特定的情况下,你要明确事件源、事件分别是什么。

  比如你在复制文件的时候想要获取完成的进度:此时的事件源为执行复制操作的这个程序,事件就是已经复制的百分比,百分比=已复制大小/总大小。

 

  这段代码的关键是使用了回调函数,回调函数在维基百科中的定义:在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其代码的,某一块可执行的引用。这一设计允许了底层代码调用在高层定义的子程序。

  以前虽然知道回调函数是给调用者一个反馈:但是在哪里调用的这样一个功能,没有使用过,还是对回调函数很模糊。

  自己写使用回调函数的代码和看别人的代码,感觉果然还是不一样的~

  

 

欢迎转载! 除非经过作者本人同意,转载请注明出处并附上原文链接!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: