关于线程和JVisualVM

时间:2014-12-20 17:15:06

标签: java multithreading performance visualvm jvisualvm

我在Java中运行以下程序(通过Eclipse IDE):

package threaddemo;

class Runner extends Thread{

    @Override
    public void run() {

        while(true)
        System.out.println("Running in a thread ....");
    }

}

public class ThreadClass {

    public static void main(String[] args) {

        Runner thread1 = new Runner();
        thread1.start();

        Runner thread2 = new Runner();
        thread2.start();

    }

}

程序运行时,我试图在JVisualVM中查看线程活动。我期望同时看到两个线程都是绿色的(即同时运行),但是我看到在执行期间的任何时间点,一段时间内任何一个线程处于Monitor状态,而另一个线程正在执行。片刻之后,它们会切换(前者正在执行,而后者处于监控状态)。怎么会这样?

1 个答案:

答案 0 :(得分:6)

你的两个线程都试图写入System.out。从writing to PrintStream is synchronized开始,每当你的一个线程正在写入流而另一个线程正在等待流可用时。

如果线程执行的某些活动不依赖于共享资源(例如,某些计算),您将能够看到线程同时执行。