【发布时间】:2012-08-03 21:36:38
【问题描述】:
我也是这个网站的新手,如果我在错误的地方或其他地方发布了这个问题,请原谅我:)
我一直在研究和创建测试程序,试图找出我创建的 ScheduledThreadPoolExecutor 可能出了什么问题。
问题:
在运行以下测试应用程序时,计划以 3 毫秒的固定速率运行的 ScheduledThreadPoolExecutor 会以超过 15 毫秒的频繁峰值运行混乱。它应该以每 3 毫秒的速率执行一次。
有趣的细节:
问题仅发生在 IDE 之外,ScheduledThreadPoolExecutor 在 Netbeans 或 IntelliJ 等 IDE 中按预期运行。
问题:
为什么我在使用 Timer 和 ScheduledThreadPoolExecutor 类时得到非常不一致的时间?执行之间的时间范围从每次执行的预期 3 毫秒到执行之间 15 毫秒的频繁峰值。
配置:
Java 7 Update 5、IntelliJ IDE、Windows 7、从命令提示符运行。
测试应用程序演示问题,确保在 IDE 之外使用以查看问题。该程序将输出大于执行之间预期时间的时间。应该是 15 毫秒左右,而不是预期的 3 毫秒。
感谢大家的帮助! :)
package testtime;
import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestTime extends JFrame {
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTime().setVisible(true);
}
});
}
JTextArea area = new JTextArea();
JScrollPane pane = new JScrollPane(area);
ScheduledThreadPoolExecutor executor;
public TestTime() {
setSize(300, 300);
setAlwaysOnTop(true);
setLocationRelativeTo(null);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
area.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
area.setText("--Press anywhere to start--\n\n" +
"If time exceeds 3 milliseconds it will be printed here...\n\n" +
"------------------------------------\n\n");
executor = new ScheduledThreadPoolExecutor(1);
executor.scheduleAtFixedRate(new Loop(), 0L, 3L, TimeUnit.MILLISECONDS);
}
@Override
public void mouseReleased(MouseEvent e) {
executor.shutdownNow();
}
});
area.setLineWrap(true);
area.setWrapStyleWord(true);
area.setText("--Press anywhere to start--");
add(pane);
}
class Loop extends Thread {
long time = 0L;
@Override
public void run() {
long timeTaken = System.nanoTime() - time;
time = System.nanoTime();
if(timeTaken > 3500000L) {
area.append(timeTaken+"(nanoseconds) -- "+(timeTaken/1000000L)+"(milliseconds)\n");
}
}
}
}
【问题讨论】:
-
在使用 IDE (Eclipse) 进行测试后,我同意您的发现(唯一标记为 3-4 毫秒)
-
欢迎来到 SO。 +1 写得很好的问题。
-
谢谢大家 :) @AlexColeman 感谢您的测试。这与我在 IDE 中得到的结果相同,但在命令提示符下运行的结果之外,我得到的峰值大于 15 毫秒,而且情况更糟。否则我会忽略小的时间变化。我不知道为什么它们在 IDE 内外有所不同。
-
@neptune692 与命令行相比,您是否在 IDE 中使用不同的 Java 版本或类似版本的发行版?
-
您的机器上有其他版本的 Java 吗?如果您确实尝试通过命令行在其他版本中进行编译,并查看仅在其他版本上运行时是否会发生这种情况。例如,我在 Java 6 中编译了您的示例并使用 Java 7(命令行)运行并看到了明显的差异。但是,当我通过命令行在 Java 6 中运行时,它似乎更加稳定。虽然这可能只是一个巧合
标签: java multithreading time threadpool