小编Joe*_*e K的帖子

ThreadPoolExecutor策略

我正在尝试使用ThreadPoolExecutor来安排任务,但遇到了一些问题.这是它陈述的行为:

  1. 如果运行的corePoolSize线程少于corePoolSize,则Executor总是更喜欢添加新线程而不是排队.
  2. 如果corePoolSize或更多线程正在运行,则Executor总是更喜欢排队请求而不是添加新线程.
  3. 如果请求无法排队,则会创建一个新线程,除非它超过maximumPoolSize,在这种情况下,该任务将被拒绝.

我想要的行为是这样的:

  1. 与上述相同
  2. 如果正在运行corePoolSize以上但不到maximumPoolSize线程,则更喜欢在排队时添加新线程,并在添加新线程时使用空闲线程.
  3. 与上述相同

基本上我不希望任何任务被拒绝; 我希望他们在无限队列中排队.但我确实想拥有maximumPoolSize线程.如果我使用无界队列,它在击中coreSize后就不会生成线程.如果我使用有界队列,它会拒绝任务.有没有办法解决?

我现在正在考虑的是在SynchronousQueue上运行ThreadPoolExecutor,但不直接向它提供任务 - 而是将它们提供给单独的无界LinkedBlockingQueue.然后另一个线程从LinkedBlockingQueue进入Executor,如果一个被拒绝,它只是再次尝试,直到它被拒绝.这看起来像是一种痛苦而且有点像黑客 - 有更清洁的方法吗?

java concurrency multithreading executor blockingqueue

13
推荐指数
1
解决办法
5281
查看次数

使用BufferedReader从大型不断增长的文件中读取

我的任务是(有效地)通过一个非常大的,不断增长的文件逐行读取.这基本上就是我现在正在做的事情:

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将返回该行的第一部分,下一次调用将返回第二部分.但我真的需要这两个部分,我需要完整的线条.

更具体地说,当发生以下事件交错时,我的问题就出现了:

  1. 写入过程会写入大部分内容
  2. readLine()被调用
  3. 编写过程完成该行并添加换行符
  4. readLine()被调用

结果是每个readLine()获取写入过程输出的整行的一部分.它在执行此操作时表现得如此,因为每次调用它时,它都会到达文件的末尾,因此返回它已读取的内容.

基本上我需要的功能是BufferedReader,它先前返回null一个readLine; 一个在它之后有一个换行符之前不会给你一条线的东西,而不仅仅是它之后的EOF.因此,如果它找到EOF,它不返回到该点的行,它返回null,并在文件被写入后返回该行,并且在它之后有一个新行.

我可能通过更直接地处理FileReader并实质上重写BufferedReader来实现这样做的粗略方法,但我不知道如何有效地执行此操作.我的实现可能不会像真正的BufferedReader快,我想避免拖慢程序的时候,还有就是要读取的数据.

java file large-files bufferedreader

9
推荐指数
1
解决办法
4016
查看次数