当前位置: 首页 > 知识库问答 >
问题:

Executorservice如何在java中工作?

江煜
2023-03-14

我熟悉传统的线程实现,但对Executorservice不太确定。我知道当使用executor服务处理线程时,它非常方便。但我对它的实现有点困惑。

假设我有一个父线程/主线程和一个最大线程池大小为10的执行器服务。现在,我只想在jms队列的大小小于1000的情况下对其执行特定任务。所以现在我可以考虑用两种方式来实现这一点。

案例1:

class MyThreadClass inmplements Runnable {
      public static void main(String args[]){
           while(true){
               int checkQueueSize = jmsQueue.getSize();
               while(checkQueueSize<1000){
                   threadPoolTaskExecutor.execute(this);
                   ++checkQueueSize;
               }
           }
      }
      public void run(){
           jmsQueue.pushMessage("Hello Thread");
      }
}

案例2:

class MyThreadClass inmplements Runnable {
          public static void main(String args[]){
            threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
               threadPoolTaskExecutor.execute(this);
          }
          public void run(){
               while(true){
                   int checkQueueSize = jmsQueue.getSize();
                   while(checkQueueSize<1000){
                       jmsQueue.pushMessage("Hello Thread");
                       ++checkQueueSize;
                   }
               }
          }
    }

我的理解是案例2不会跨越多个线程。我是否正确?或者有其他方法来执行任务?

共有2个答案

司空元凯
2023-03-14

请查找我的代码:-

    class MyThreadClass inmplements Runnable {
        public static void main(String args[]){
          threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
          for(int i=0;i<10;i++)
             threadPoolTaskExecutor.execute(this);
        }
        public void run(){
             while(true){
                 int checkQueueSize = jmsQueue.getSize();

                 if(checkQueueSize<=1000){
                     jmsQueue.pushMessage("Hello Thread");
                 }
             }   
        }
  }

修改:-

  1. 创建10个线程并通过传递Runnable类对象将它们分配给运行作业。
    1. 删除不必要的当循环作为执行infite itaration的外部循环时。

唐修明
2023-03-14

“情况2不会跨越多个线程”是。这是正确的。因为您只调用一次执行。

在第一个场景中,您可以多次调用execute。若前一个任务未完成,将运行额外的线程。

 类似资料:
  • 我有一个简单的java,它运行一些任务对象(实现)。 除了尽最大努力尝试停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过{@link thread#interrupt}取消,因此任何未能响应中断的任务都可能永远不会终止。 我的问题是,有没有办法确保那些(任务)线程会终止?我想出的最佳解决方案是在程序末尾调用,但这显然是愚蠢的。

  • 问题内容: 我向Java的executorservice提交了一堆作业,但我想以某种方式暂时暂停所有这些作业。最好的方法是什么?我该如何恢复?还是我这样做完全错误?我是否应该遵循其他想要实现的模式(即暂停/恢复执行服务的能力)? 问题答案: 为了回答我自己的问题,我在 本身的javadocs中找到了一个示例。这是我使用番石榴显示器的版本:

  • 问题内容: 我对Java同步有疑问。我想知道我的类中是否有三个同步方法,并且一个线程在一个同步方法中获得了锁,另外两个将被锁定吗?我问这个问题是因为我对以下陈述感到困惑。 当线程处于对象的同步方法内部时,希望执行该同步方法或对象的任何其他同步方法的所有其他线程将必须等待。此限制不适用于已经具有锁并正在执行对象的同步方法的线程。这样的方法可以调用对象的其他同步方法而不会被阻塞。当然,任何线程都可以随

  • 问题内容: 最近,我遇到了这段Java代码: 为“ a”打印的值为0。但是在C的情况下,“ a”的值为100。 我不明白为什么在Java情况下该值为0。 问题答案: a = a++; 从递增开始,然后返回到旧值,返回未递增的值。 简而言之,它在Java中什么也不做。如果要增加,请仅使用postfix运算符,如下所示:

  • > 在将所有内容提交给后, 在上调用 则在shutdown()之前提交的所有任务都实际完成运行之前,awaitTermination()才返回。--然后在上调用,但是由于提交给的所有任务都已完成,并且从上的任务中提交给的所有任务都已提交给,所以在上调用之前,所有任务都已提交给。--对于以此类推 但是,我现在添加了这样一种情况,即可以将datapacket分解成一个较小的包,并在上提交额外的任务,而

  • 问题内容: 使用return by时,如何中断它? 问题答案: 为此,您需要将任务分配给,而不是调用。当您执行此操作时,将返回一个可用于操纵计划任务的a。特别是,您可以调用关联程序来中断当前正在执行的任务(或者,如果该任务尚未开始运行,则完全跳过执行)。 顺便说一句,由返回的对象实际上是个。