Java-如何停止调用方法?

时间:2014-04-28 10:53:30

标签: java methods actionlistener method-call

我有一个Java方法,当被调用时,它将侦听通过网络发送的任何流量,并将有关该流量的信息打印到控制台。我的程序目前在控制台中运行,但我现在正在创建一个图形用户界面,以允许用户与程序进行交互。

目前,当我运行我的程序时,它会不断地将有关网络流量的声明打印到控制台,只要它正在运行,并且我必须停止运行的唯一方法是单击“终止”按钮。 Eclipse控制台窗口。

然而,通过我正在制作的图形用户界面,我有一个“开始”按钮,用户可以点击该按钮开始收听网络上的任何流量 - 但是一旦它开始收听,我就无法允许用户通过GUI停止它。

由于总会有信息通过网络发送,我不能等到没有收到信息才能停止通话 - 我想要做的是添加一个“停止”按钮,停止调用方法(即阻止我的程序监听网络流量),但我不知道我需要用什么方法来编写/调用来阻止第一种方法的监听。

对于我的“开始”按钮,我有一个ActionListener,它会监听按钮上的一个点击,并在听到一个类时从另一个类调用该方法。我可以创建一个“停止”按钮,但我不知道的是当ActionListener听到点击它时停止第一个方法被调用的方法。

有人有任何建议吗?

编辑28/04/2014 @ 14:15

这是我用来创建“停止”按钮的代码:

JButton stopCaptureButton = new JButton("Stop");
panel.add(stopCaptureButton);
stopCaptureButton.setBounds(875, 350, 80, 30);

stopCaptureButton.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e){
        EspduReceiver.stopCapture = true;
        pool.shutdown();
    }
});

但出于某种原因,当我点击它时绝对没有任何反应......

我用来捕获网络信息的方法称为receivePdu(),在此方法的开头,我有条件while(true){...,然后是用于捕获正在获取的信息的所有代码通过网络发送。

receivePdu()方法结束时,我有以下代码:

Boolean queryStopCapture = stopCapture;
if(queryStopCapture == true){
    break;
}

变量stopCapture是一个全局变量,与receivePdu()方法在同一个类中定义,行public static Boolean stopCapture = false;'

正如您所看到的,当我在stopCapture上检测到点击时,我将true的值设置为stopCaptureButton,最终会触发break;我的receivePdu()方法,但它似乎没有这样做。

任何想法为什么?或者我做错了什么?

3 个答案:

答案 0 :(得分:0)

您需要将此任务放入ExecutorService,然后在ActionListener中调用shutdown以停止。

// this could be cachedThreadPool or whatever
ExecutorService pool = Executors.newSingleThreadExecutor();

ActionListener start = new ActionListener(){

    public void actionPerformed(ActionEvent e) {
        pool.execute(new Runnable(){
            public void run(){
                checkTraffic();
            }
        });
    }
};

ActionListener stop = new ActionListener(){

    public void actionPerformed(ActionEvent e) {
        pool.shutdown();
    }
};

你可以放入支票或其他任何东西,以确保只调用一次。

答案 1 :(得分:0)

您可以在检查流量的循环中反转控件:

while(true) {
  checkTraffic();
  Thread.sleep(1000);
}

您可以添加控件:

while(true) {
  checkTraffic();
  boolean shouldIStop = lookAVariableSomewhere(); //File or database
  if(shouldIStop) {
    break;
  }
  Thread.sleep(1000);
}

然后你的"停止"按钮更新此变量。

答案 2 :(得分:0)

似乎问题是我有一个无限循环,这意味着永远不会调用break;语句。