我是新太這個網站,所以原諒我,如果我已經發布了這個問題,在錯誤的地方或東西:)Java ScheduledThreadPoolExecutor延遲15毫秒/不一致的時間?
我一直在研究和創建測試程序不停的試圖找出什麼可能是用我創建的ScheduledThreadPoolExecutor出錯。
問題:
當運行下面的測試應用程序安排在3毫秒的固定速率運行的ScheduledThreadPoolExecutor具有大於15毫秒頻繁尖峯無序運行。它應該以每3毫秒的速率執行。
有趣的細節:
僅發生IDE外的問題,運行的ScheduledThreadPoolExecutor如預期的IDE如Netbeans的或內部的IntelliJ。
問:
爲什麼會收到使用定時器和的ScheduledThreadPoolExecutor類非常不一致的時間?執行之間的時間範圍爲每次執行期望的3毫秒到執行之間15毫秒的頻繁尖峯。
配置:
Java 7的更新5,IDE的IntelliJ,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)進行測試時,我同意在WinXP上運行的那個(唯一標記的是3-4ms) – 2012-08-06 21:58:00
? – bestsss 2012-08-06 22:08:19
歡迎來到SO。 +1爲一個寫得很好的問題。 – 2012-08-06 22:13:14