将任务提交到ExecutorService对象的执行顺序是什么?

将任务提交到ExecutorService对象的执行顺序是什么?

场景:让我们暂时假设执行器线程池大小为5,并且我已向其提交了20个可运行任务,我们知道一次只能执行5个任务,其余将等待在桶里。所以我的问题是提交任务以什么顺序执行。它遵循FIFO数据结构还是从存储桶中随机选择任务。

此外,有什么方法可以指定执行顺序。

示例:

ExecutorService executor = Executors.newFixedThreadPool(5);
for(int i =0; i < 100; i++){
  executor.submit(() -> {
    System.out.println("print task");
  })
}
pyxiaoxiao 回答:将任务提交到ExecutorService对象的执行顺序是什么?

它使用LinkedBlockingQueue来存储挂起的任务。因此,它遵循FIFO顺序处理未决任务。请找到Java文档以及方法签名。

public class ExtractNumber {

public static void main(String[] args) throws IOException { 
    PDDocument doc = PDDocument.load(new File("yourFile location"));

    PDFTextStripper stripper = new PDFTextStripper();
    List<String> digitList = new ArrayList<String>();

    //Read Text from pdf 
    String string = stripper.getText(doc);

    // numbers follow by string
    Pattern mainPattern = Pattern.compile("[a-zA-Z]\\d+");

    //Provide actual text
    Matcher mainMatcher = mainPattern.matcher(string);
    while (mainMatcher.find()) {
        //Get only numbers
        Pattern subPattern = Pattern.compile("\\d+");
        String subText = mainMatcher.group();
        Matcher subMatcher = subPattern.matcher(subText);
        subMatcher.find();
        digitList.add(subMatcher.group());
    }

    if (doc != null) {
        doc.close();
    }

    if(digitList != null && digitList.size() > 0 ) {
        for(String digit: digitList) {
            System.out.println(digit);
        }
    }
}

}
,

这取决于线程池和队列的实现。

对于ThreadPoolExecutor,队列几乎始终是SynchronousQueue,LinkedBlockingQueue或ArrayBlockingQueue。 ArrayBlockingQueue和LinkedBlockingQueue保证FIFO顺序。对于SynchronousQueue,它取决于同步机制的FIFO能力,因为SynchronousQueue一次只能保留一个元素。 您最好假设它不能保证。

对于ScheduledThreadPoolExecutor,该队列是DelayQueue。 基本上,这是一个优先级队列,很可能使用堆数据结构实现。任务将按照延迟的顺序从队列中取出,但是对于两个具有相同延迟的任务,不能保证FIFO。

但是,毕竟,考虑到线程的前置特性,从队列中挑选一个任务并不意味着它会立即执行。执行程序的主循环基本上看起来像这样:

public void run () {
    while(!terminated) {
        Runnable task = queue.take();
        task.run();
    }
}

请考虑两个线程正在运行此代码。这种情况可能会发生:

  1. 线程1:Runnable task = queue.take()
  2. 线程2:Runnable task = queue.take()
  3. 线程2:task.run();
  4. 线程1:task.run();

voilà,第二个任务排在队列之后,但是在第一个任务之前执行。实际上,这种情况一直存在。

最后,您不能也不应承担任何责任。

本文链接:https://www.f2er.com/2973047.html

大家都在问