它使用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:
Runnable task = queue.take()
- 线程2:
Runnable task = queue.take()
- 线程2:
task.run();
- 线程1:
task.run();
voilà,第二个任务排在队列之后,但是在第一个任务之前执行。实际上,这种情况一直存在。
最后,您不能也不应承担任何责任。
本文链接:https://www.f2er.com/2973047.html