Java:如何在多线程程序中测试细粒度

Java:如何在多线程程序中测试细粒度,java,multithreading,Java,Multithreading,在Java中,我有简单的多线程代码: public class ThreadedAlgo { public static final int threadsCount = 3; public static void main(String[] args) { // start timer prior computation time = System.currentTimeMillis(); // create thread

在Java中,我有简单的多线程代码:

public class ThreadedAlgo {

    public static final int threadsCount = 3;

    public static void main(String[] args) {

        // start timer prior computation
        time = System.currentTimeMillis();

        // create threads
        Thread[] threads = new Thread[threadsCount];

        class ToDo implements Runnable {
            public void run() { ... }
        }

        // create job objects
        for (int i = 0; i < threadsCount; i++) {
            ToDo job = new ToDo();
            threads[i] = new Thread(job);
        }

        // start threads
        for (int i = 0; i < threadsCount; i++) {
            threads[i].start();
        }

        // wait for threads above to finish
        for (int i = 0; i < threadsCount; i++) {
            try {
                threads[i].join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        // display time after computation
        System.out.println("Execution time: " + (System.currentTimeMillis() - time));

    }

}
它工作得很好,现在我想为2或3个线程运行它,并计算每个线程的计算时间。然后我会比较时间:用t1和t2来表示,如果| t1-t2 |<小ε,我会说我的算法在某些给定条件下执行的粒度很细,即线程花费的时间相对相同


如何测量线程的时间?

在线程作业的开始和结束时使用System.nanoTime方法来计算每次调用花费的总时间。在您的情况下,所有线程都将以相同的默认优先级执行,其中时间片的分配应该相当公平。如果线程是互锁的,出于同样的原因使用“公平锁”;e、 g.

在运行方法中添加计时逻辑

不,我的线程是独立的,非常适合测量。这不是一种很好的时间测量方法吗?没关系,我只是喜欢这种东西的最高分辨率。如果线程的运行时间不足以达到毫秒分辨率,那么创建线程的开销可能更大。只是提醒一下,System.nanoTime可能会返回看似随机的值。看,我认为使用分析工具,而不是试图读取计时器,会更好地为您服务。即使有计时器,我也不会相信任何小于毫秒的数字。纳秒级的结果纯粹是科幻小说:IMHO。建议:这里有一个关于Eclipse Profiler的优秀教程: