单线程服务器怎样提高性能,如何在使用ExecutorService和线程超时功能的同时提高性能?...

我不是一个多线程专家,但我看到一些性能问题与我使用ExecutorService的当前代码。如何在使用ExecutorService和线程超时功能的同时提高性能?

我正在开发一个项目,在该项目中需要对我的服务器进行HTTP URL调用,如果响应时间过长,则超时。目前它正在返回简单的JSON字符串..

我现在的要求是为10 ms。在10 ms之内,它应该能够从服务器获取数据。我猜它是可能的,因为它只是在同一个数据中心内对服务器的HTTP调用。

我的客户端程序和实际服务器是同一个数据中心的ping时间延迟内他们之间0.5 ms所以它应该是可行的肯定..

我使用RestTemplate这使URL调用。

下面是我的代码,我已经写了我它采用ExecutorService和Callables -

public class URLTest {

private ExecutorService executor = Executors.newFixedThreadPool(10);

public String getData() {

Future future = executor.submit(new Task());

String response = null;

try {

System.out.println("Started..");

response = future.get(100, TimeUnit.MILLISECONDS);

System.out.println("Finished!");

} catch (TimeoutException e) {

System.out.println("Terminated!");

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

}

return response;

}

}

下面是实现Callable接口我的任务类 -

class Task implements Callable {

private RestTemplate restTemplate = new RestTemplate();

public String call() throws Exception {

// TimerTest timer = TimerTest.getInstance(); // line 3

String response = restTemplate.getForObject(url, String.class);

// timer.getDuration(); // line 4

return response;

}

}

而下面是我的代码另一个类DemoTest它调用getData方法在URLTest类500 times并测量它的第95个百分点的端到端 -

public class DemoTest {

public static void main(String[] args) {

URLTest bc = new URLTest();

// little bit warmup

for (int i = 0; i <= 500; i++) {

bc.getData();

}

for (int i = 0; i <= 500; i++) {

TimerTest timer = TimerTest.getInstance(); // line 1

bc.getData();

timer.getDuration(); // line 2

}

// this method prints out the 95th percentile

logPercentileInfo();

}

}

用,因为它是上面的代码中,我总是看到第95百分位为14-15 ms(这是坏我的使用情况,因为它是端到端的流程,这就是我需要衡量)。

我很惊讶,为什么? ExectuorFramework是否在此添加所有延迟?可能是提交每个任务,提交线程正在等待(通过future.get),直到任务完成。

我的主要目标是尽可能地减少延迟。我的用例很简单,使用TIMEOUT功能启用对我的服务器之一的URL调用,这意味着服务器是否花费大量时间来响应,然后超时整个呼叫。客户会打电话给我们的代码从那里可以多线程的应用程序以及..

有什么我失踪或ExecutorService我需要使用一些其他口味?我怎样才能在这里提高我的表现?任何建议,将有很大的帮助..

任何例子将不胜感激。我正在读关于ExecutorCompletionService不知道我是否应该使用这种或别的东西..

2014-01-20

ferhan

+0

真的不明白你期望通过摆脱线程池实现来实现Web服务器的性能吗?看看Web服务器和Web客户端...!您需要在Web客户端上设置超时时间,以便实际放弃。随着未来的超时,你只是放弃了这项任务,但工作线程仍然在那里试图完成,直到完成。 –

+0

这看起来很漂亮,单线程给我...... –

+0

这不是错误的执行者框架。有些东西比你想象的要长。我建议考虑运行Java分析器。您也可以记录系统各个部分的壁钟,以了解需要花费多长时间。 –

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值