ExecutorService添加延迟

时间:2017-03-07 06:43:55

标签: java multithreading executorservice

我有一个非常简单的程序,它使用ExecutorService。

我已经设定了号码。线程为4,但所用时间与设置为2相同。

以下是我的代码:

public class Test {
     private static final Logger LOGGER = Logger.getLogger("./sample1.log");

    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws Throwable {
        ExecutorService service = Executors.newFixedThreadPool(4);
        Future<String> resultFirst = service.submit(new FirstRequest());
        Future<String> resultSecond = service.submit(new SecondRequest());
        Future<String> resultThird = service.submit(new ThirdRequest());
        Future<String> resultFourth = service.submit(new FourthRequest());

        String temp1 = resultSecond.get();
        temp1 = temp1.replace("Users", "UsersAppend1");

        String temp2 = resultThird.get();
        temp2 = temp2.replace("Users", "UsersAppend2");

        String temp3 = resultFourth.get();
        temp3 = temp3.replace("Users", "UsersAppend3");

        //System.out.println(resultFirst.get() + temp1 + temp2 + temp3);
        //LOGGER.info("Logger Name: "+LOGGER.getName());

        LOGGER.info(resultFirst.get() + temp1 + temp2 + temp3);

        service.shutdownNow();
        service.awaitTermination(10, TimeUnit.SECONDS);

        System.exit(0);
        }
}

这里FirstRequest,SecondRequest,ThirdRequest和FourthRequest是不同的类,它们调用另一个对所有人都通用的类。

我为公共类创建了不同的对象,所以我认为这不是死锁/饥饿的情况。

3 个答案:

答案 0 :(得分:2)

您想要启动here - 意思是:实际上 hard 以合理的方式衡量Java执行时间。你有一个过于简化的观点;因此你的测量结果并没有任何意义。

除此之外:你必须明白这个&#34;更多线程&#34;不要神奇地减少整体运行时间。这在很大程度上取决于你在做什么;例如,您的线程花多少时间等待用于IO。

含义:&#34;添加&#34;线程只有在每个线程处于非活动状态时才会有帮助。一段时间。当每个线程不断地以100%的速度燃烧CPU周期时......那么更多的线程没有帮助;恰恰相反:时间变得更糟,因为你唯一要做的就是添加开销来设置和切换你的任务。

答案 1 :(得分:0)

你有多少个处理器?所花费的时间取决于您正在执行的任务类型,您在任务中使用的资源类型等。 添加更多线程并不意味着您的进程会变得更快,只是意味着如果有可用的空闲处理能力,那么java将尝试使用它们。

答案 2 :(得分:0)

  

我已经设定了号码。线程为4,但所用时间与设置为2相同。

这是一个非常常见的问题。我听说无数次有时很难将单线程应用程序转变为多线程应用程序,因此发现它运行速度不快。由于线程开销和重构问题,它实际上可以运行得更慢。

这个类比是一个项目过度劳累的研究员。你可以将他们的工作分成4个研究生同时工作,但如果他们都要问问研究员的问题,那么这个项目就不会更快,4名研究生之间缺乏协调可以让项目花费更长时间。

唯一一次向应用程序添加其他线程最终提高吞吐量的时间是线程是:

  1. 完全独立 - 即不在线程之间共享数据(或者不是很多),当它们阻塞或必须同步内存时
  2. 完全受CPU限制 - 即只进行数据处理而不是等待磁盘或网络IO或其他系统资源
  3. 能够使用其他系统CPU
  4.   

    这里的FirstRequest,SecondRequest,ThirdRequest和FourthRequest是不同的类,调用另一个所有共同的类。

    对,这是一面红旗。 First / Second / ...请求类可以同时工作,但如果他们必须在公共类中调用synchronized块,那么它们将相互阻塞。线程编程的一个棘手问题是如何在完成任务的同时限制数据共享。如果您展示了更多的普通课程,那么我们可以为您提供更多帮助。

    另一个大红旗是任意数量的IO。注意读写磁盘或网络。还要注意记录或其他输出。从磁盘读取一个线程,处理读取的内容的多个线程和一个线程写入通常是有效的。但即便如此,如果处理不是CPU密集型,您可能会看到很少甚至没有速度提升,因为应用程序的速度受到磁盘设备IO带宽的限制。

    为每个要处理的请求生成线程的Web应用程序可以高效,因为它们同时处理如此多的网络IO绑定请求。但真正的胜利是来自线程能够专注于其请求的代码改进,然后线程子系统将在线程被阻塞等待网络或磁盘IO时处理请求之间的上下文切换。