Java 定时器为';t相对于实例

Java 定时器为';t相对于实例,java,timer,http-get,Java,Timer,Http Get,类中的非静态方法发送HTTP get请求,该请求经常“挂起”(永远等待响应);为了在某个超时后将其切断,我使用了一个计时器,如中所示 每次调用该方法并启动get时,我都希望计时器从头开始 但事实并非如此;发生的情况是,计时器在第一次调用该方法时启动,并在整个程序执行期间继续运行;当它超时时,它将中止当前正在运行的get请求 以下是我的代码(简化): processRequest对其所属类的每个实例调用一次;在第一次调用后,程序在超时持续时间后退出 编辑:或者它是第一个继续运行的计时器,当我收到g

类中的非静态方法发送HTTP get请求,该请求经常“挂起”(永远等待响应);为了在某个超时后将其切断,我使用了一个
计时器
,如中所示

每次调用该方法并启动get时,我都希望计时器从头开始

但事实并非如此;发生的情况是,计时器在第一次调用该方法时启动,并在整个程序执行期间继续运行;当它超时时,它将中止当前正在运行的get请求

以下是我的代码(简化):

processRequest对其所属类的每个实例调用一次;在第一次调用后,程序在
超时持续时间后退出

编辑:或者它是第一个继续运行的计时器,当我收到get响应时,我需要杀死它

Edit2:好的,这样就解决了问题:在收到响应时添加
timer.cancel()
,可以避免问题。但我不明白为什么
get
与一个实例相关;来自前一个实例的计时器如何中止属于另一个实例的get

如何使来自前一个实例的计时器能够 中止属于另一个实例的get

因为
系统退出(1)在整个应用程序上运行。一旦启动计时器,它将在超时后关闭整个应用程序。除非取消


所有
processRequest()
实例共享同一个应用程序,因此调用
System.exit(1)会杀死所有密码

系统。退出(1);会拒绝你的全部申请。是的,这就是我们想要的;如果我们对任何请求都有超时,几乎可以肯定的是,这意味着服务器已关闭。所以我们不想继续这个程序,因为这样做会向停机的服务器发送更多的请求。我们需要呼叫某人使服务器重新启动。您是否在需要响应后取消计时器?请使用“ArrayBlockingQueue(1)”。您这样做的方式将在10秒后终止您的应用程序。@rcook,不,这是我的问题!;-)但还不清楚给定实例的计时器如何终止另一个实例的请求。我假设如果请求已经响应,就不可能中止(),因此System.exit(1)将永远不会执行,因为在它之前会抛出异常;但事实上get.abort()对于关闭的请求没有任何问题。
public void processRequest() throws Exception {
  final HttpClient client = HttpClientBuilder.create().build();
  final String target = this.someString;
  final int timeout = 10;
  HttpGet get = new HttpGet(target);

  Timer timer = new Timer();
  timer.schedule(new TimerTask() {
    public void run() {
      try {
        get.abort();
        // if the request times out it probably means
        // the server is down so we exit the program
        // and don't run any more requests
        System.exit(1);
        }
     catch (Exception e) {
        // warn that something went wrong
        }
      }
    }, timeout * 1000);
  //Execute and get the response
  final HttpResponse response = client.execute(get);
  final int code = response.getStatusLine().getStatusCode();
  if (code == 200) {
    // do something with the response, etc.
    }
  }