首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IllegalArgumentException的并发ScheduledThreadPoolExecutor for scheduleAtFixedRate

IllegalArgumentException的并发ScheduledThreadPoolExecutor for scheduleAtFixedRate
EN

Stack Overflow用户
提问于 2017-07-14 00:02:42
回答 2查看 1.2K关注 0票数 1

我正在我的Mac上运行HotSpot,JDK8的测试文件。我使用IntelliJ IDEA来运行这个java程序。

代码语言:javascript
复制
IntelliJ IDEA 2017.1.2
Build #IC-171.4249.39, built on April 25, 2017
JRE: 1.8.0_112-release-736-b16 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Mac OS X 10.12.5

frequency文件中设置Runner.java时出错。例如,如果我将25,5设置为在下面的作业中替换50,我将得到错误。为什么会这样呢?

int frequency = 50 * runSpecification.objectSize / runSpecification.allocationRatePerSecond; // 25 will fail and yield bug

代码语言:javascript
复制
Exception in thread "main" java.lang.IllegalArgumentException
    at java.util.concurrent.ScheduledThreadPoolExecutor.scheduleAtFixedRate(ScheduledThreadPoolExecutor.java:565)
    at eu.plumbr.gc.Runner.run(Runner.java:30)
    at eu.plumbr.gc.Runner.main(Runner.java:21)

Process finished with exit code 1
代码语言:javascript
复制
.
└── main
    └── java
        └── eu
            └── plumbr
                └── gc
                    ├── Consumer.java
                    ├── Producer.java
                    ├── RunSpecification.java
                    └── Runner.java

5 directories, 4 files

Consumer.java

代码语言:javascript
复制
package eu.plumbr.gc;

import java.util.Deque;

public class Consumer implements Runnable{

  private Deque<byte[]> deque;

  public Consumer(Deque<byte[]> deque) {
    this.deque = deque;
  }

  @Override
  public void run() {
    deque.poll();
  }
}

Producer.java

代码语言:javascript
复制
package eu.plumbr.gc;

import java.util.Deque;

public class Producer implements Runnable {

  private Deque<byte[]> deque;
  private int objectSize;

  public Producer(Deque<byte[]> deque, int objectSize) {
    this.deque = deque;
    this.objectSize = objectSize;
  }

  @Override
  public void run() {
    deque.add(new byte[objectSize]);
  }
}

Runner.java

代码语言:javascript
复制
package eu.plumbr.gc;

import java.util.ArrayDeque;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Runner {

  private RunSpecification runSpecification;
  private ScheduledExecutorService executorService;

  public Runner(RunSpecification runSpecification, ScheduledExecutorService executorService) {
    this.runSpecification = runSpecification;
    this.executorService = executorService;
  }


  public static void main(String[] args) throws InterruptedException {
    Runner runner = new Runner(new RunSpecification(10 * 1024, 1024 * 500, 5), Executors.newScheduledThreadPool(2));
    runner.run();
  }

  public void run() {
    ArrayDeque<byte[]> deque = new ArrayDeque<byte[]>();
    Producer producer = new Producer(deque, runSpecification.objectSize);
    Consumer consumer = new Consumer(deque);

    int frequency = 50 * runSpecification.objectSize / runSpecification.allocationRatePerSecond; // 25 will fail and yield bug
    executorService.scheduleAtFixedRate(producer, 0, frequency, TimeUnit.MILLISECONDS);
    executorService.scheduleAtFixedRate(consumer, 1000 * runSpecification.ttl, frequency, TimeUnit.MILLISECONDS);
  }
}

RunSpecification.java

代码语言:javascript
复制
package eu.plumbr.gc;

public class RunSpecification {
  public int objectSize;
  public int allocationRatePerSecond;
  public int ttl;

  public RunSpecification(int objectSize, int allocationRatePerSecond, int ttl) {
    this.objectSize = objectSize;
    this.allocationRatePerSecond = allocationRatePerSecond;
    this.ttl = ttl;
  }
}

参考资料:

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-14 03:00:42

如果您阅读javadocs,您将看到

IllegalArgumentException -如果周期小于或等于零

不知道你的确切输入,但我要说的是

代码语言:javascript
复制
int frequency = 50 * runSpecification.objectSize / 
                      runSpecification.allocationRatePerSecond;

frequency大于0,但使用25则不是

请记住,您正在进行Integer除法,这可以由

代码语言:javascript
复制
    int objectSize = 10240; 
    int allocationRatePerSecond = 512000;

    System.out.println(50 * objectSize / allocationRatePerSecond);
    System.out.println(25 * objectSize / allocationRatePerSecond);

输出

代码语言:javascript
复制
1
0
票数 4
EN

Stack Overflow用户

发布于 2020-06-18 00:59:14

根据“可怕的袋鼠”提出的解决方案,我已经做了修改并消除了错误。ie.,IllegalArgumentException -如果周期小于或等于零

初始代码:

代码语言:javascript
复制
private ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(this, 0, 1, TimeUnit.valueOf(DAYS));

修正代码:

代码语言:javascript
复制
private ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(this, 1, 1, TimeUnit.valueOf(DAYS));

将第二个参数从0更改为1,它就成功了!!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45092642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档