如何获取算法运行状态

  最近在学习过程中遇到了这个问题:如何获取算法的执行状态?

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

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

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

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

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

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

  步骤大概是这样的:

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

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

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

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

  

 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 算法执行完毕!

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

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

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

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

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

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

  

时间: 2024-10-12 22:38:08

如何获取算法运行状态的相关文章

JAVA程序获取Tomcat的运行状态

用浏览器来查看Tomcat的运行状态: 配置Tomcat的管理用户和权限. 打开%Tomcat_Home%/conf/目录下的tomcat-user.xml文件,配置以下内容: <role rolename="manager-status"/> <role rolename="manager"/>   <role rolename="manager-jmx"/>  <role rolename="

Spark MLlib算法调用展示平台及其实现过程

1. 软件版本: IDE:Intellij IDEA 14,Java:1.7,Scala:2.10.6:Tomcat:7,CDH:5.8.0: Spark:1.6.0-cdh5.8.0-hadoop2.6.0-cdh5.8.0 : Hadoop:hadoop2.6.0-cdh5.8.0:(使用的是CDH提供的虚拟机) 2. 工程下载及部署: Scala封装Spark算法工程:https://github.com/fansy1990/Spark_MLlib_Algorithm_1.6.0.git

Android逆向之旅---静态方式破解微信获取聊天记录和通讯录信息

一.猜想数据存放路径 微信现在是老少皆宜,大街小巷都在使用,已经替代了传统的短信聊天方式了,只要涉及到聊天就肯定有隐私消息,那么本文就来讲解如何获取微信的聊天记录以及通讯录信息. 首先我们在没有网络的时候,打开微信同样可以查看聊天记录,说明微信会把聊天记录保存到本地,那么这么多信息肯定会保存在数据库中,所以我们可以去查看微信的databases目录看看内容: 可惜的是,我们在这个里面并没有发现一些有用的数据,所以这时候就了解到了微信因为把重要信息的数据库存在其他目录下面,我们可以直接把微信的整个

[蟒蛇菜谱] Python调用shell命令,获取返回值和返回信息

# -*- coding: utf-8 -*- import os import subprocess import signal class MockLogger(object): '''模拟日志类.方便单元测试.''' def __init__(self): self.info = self.error = self.critical = self.debug def debug(self, msg): print "__LOGGER__:"+msg class Shell(obj

openssl开源程序dh算法解析之dh_ameth.c

#include <stdio.h> #include "cryptlib.h" #include <openssl/x509.h> #include <openssl/asn1.h> #include <openssl/dh.h> #include <openssl/bn.h> #include "asn1_locl.h" #ifndef OPENSSL_NO_CMS # include <open

基于SignalR实现B/S系统对windows服务运行状态的监测

通常来讲一个BS项目肯定不止单独的一个BS应用,可能涉及到很多后台服务来支持BS的运行,特别是针对耗时较长的某些任务来说,Windows服务肯定是必不可少的,我们还需要利用B/S与windows服务进行交互,来实现更好的用户体验,搭配redis,memcached等来实现分布式缓存,消息列队处理等等... 但是通常情况我们在B/S端是无法得知其依赖的windows服务当前处于什么样的运行状态,只能通过到server里面去进行查看,或者通过其他途径! 今天我们就通过SignalR来实现一个B/S端

RSA不对称算法,对数据加密解密!

package com.yjm.test509; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; impo

PHP-密码学算法及其应用-对称密码算法

转自:http://www.smatrix.org/bbs/simple/index.php?t5662.html //////////////////////////////////////////////////////////////////////////////目录1.    PHP的散列函数及其应用2.    PHP中的对称密码算法及其应用3.    PHP的公钥密码算法及其应用/////////////////////////////////////////////////////

PHP-密码学算法及其应用-散列函数

转自http://www.smatrix.org/bbs/simple/index.php?t5591.html //////////////////////////////////////////////////////////////////////////////目录1.    PHP的散列函数及其应用2.    PHP中的对称密码算法及其应用3.    PHP的公钥密码算法及其应用//////////////////////////////////////////////////////