我正在尝试使用ThreadPoolExecutor来安排任务,但遇到了一些问题.这是它陈述的行为:
我想要的行为是这样的:
基本上我不希望任何任务被拒绝; 我希望他们在无限队列中排队.但我确实想拥有maximumPoolSize线程.如果我使用无界队列,它在击中coreSize后就不会生成线程.如果我使用有界队列,它会拒绝任务.有没有办法解决?
我现在正在考虑的是在SynchronousQueue上运行ThreadPoolExecutor,但不直接向它提供任务 - 而是将它们提供给单独的无界LinkedBlockingQueue.然后另一个线程从LinkedBlockingQueue进入Executor,如果一个被拒绝,它只是再次尝试,直到它被拒绝.这看起来像是一种痛苦而且有点像黑客 - 有更清洁的方法吗?
我的任务是(有效地)通过一个非常大的,不断增长的文件逐行读取.这基本上就是我现在正在做的事情:
BufferedReader rd = //initialize BufferedReader
String line;
while(true){
while((line=rd.readLine())==null){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
//handle exception
}
}
//process line
}
Run Code Online (Sandbox Code Playgroud)
所以我的BufferedReader只是挂在文件的末尾,直到有更多东西要读.这很好用,但是有一个问题 - 如果在写入文件的过程正在写一行的过程中调用readLine.然后第一次调用readLine将返回该行的第一部分,下一次调用将返回第二部分.但我真的需要这两个部分,我需要完整的线条.
更具体地说,当发生以下事件交错时,我的问题就出现了:
结果是每个readLine()获取写入过程输出的整行的一部分.它在执行此操作时表现得如此,因为每次调用它时,它都会到达文件的末尾,因此返回它已读取的内容.
基本上我需要的功能是BufferedReader,它先前返回null一个readLine; 一个在它之后有一个换行符之前不会给你一条线的东西,而不仅仅是它之后的EOF.因此,如果它找到EOF,它不返回到该点的行,它返回null,并在文件被写入后返回该行,并且在它之后有一个新行.
我可能通过更直接地处理FileReader并实质上重写BufferedReader来实现这样做的粗略方法,但我不知道如何有效地执行此操作.我的实现可能不会像真正的BufferedReader快,我想避免拖慢程序的时候,还有就是要读取的数据.