2016-07-29 41 views
1

我有一个应用程序从其他应用程序接收警报,通常一分钟左右,但我需要能够处理每分钟更高的音量。我使用的接口和Alert框架通常要求警报可以异步处理,并且可以在异步处理警报时停止。停止方法具体记录为停止线程。我编写了下面的代码来创建AlertRunner线程,然后停止线程。但是,这是处理终止线程的正确方法吗?此代码是否能够轻松扩展(不是可笑的音量,但可能同时发出第二个或多个提醒警报)?这是一种安全的方式来生成新线程并终止它们?

private AlertRunner alertRunner; 

@Override 
public void receive(Alert a) { 
    assert a != null; 
    alertRunner = new alertRunner(a.getName()); 
    a.start(); 
} 

@Override 
public void stop(boolean synchronous) { 
    if(!synchronous) { 
     if(alertRunner != null) { 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 

class AlertRunner extends Thread { 
    private final String alertName; 

    public AlertRunner(String alertName) { 
     this.alertName = alertName; 
    } 

    @Override 
    public void run() { 
     try { 
      TimeUnit.SECONDS.sleep(5); 
      log.info("New alert received: " + alertName); 
     } catch (InterruptedException e) { 
      log.error("Thread interrupted: " + e.getMessage()); 
     } 
    } 
} 
+0

我想知道是否Thread.currentThread()。interrupt();'做了你认为它的作用。它所做的是,它会在调用你的stop()方法的线程中设置_interrupted标志_。我怀疑的原因是,很少有任何理由让线程自行中断。 –

回答

2

由于Thread是相当“重”的对象,所以此代码不会轻易缩放。创建起来很昂贵,而且开始很昂贵。为您的任务使用ExecutorService要好得多。它将包括准备处理您的请求的线程数量有限:

int threadPoolSize = 5; 
ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize); 

public void receive(Alert a) { 
    assert a != null; 
    executor.submit(() -> { 
     // Do your work here 
    }); 
} 

这里executor.submit()将处理在一个单独的线程您的请求。如果所有线程现在都处于繁忙状态,请求将在队列中等待,从而防止资源耗尽。它还会返回Future的实例,您可以使用该实例等待处理完成,设置超时,接收结果,取消执行以及许多其他有用的事情。

+0

谢谢,这就是我正在寻找的!当我取消执行时,它是否取消了应该取消的一个警报的执行? – SVN600

+0

是的,在Future中调用'cancel()'取消特定任务:'Future f = executor.submit(( - ){...});'然后'f.cancel(true) –

相关问题