Java是否实际并行运行线程

时间:2015-03-09 07:59:25

标签: java multithreading java-ee parallel-processing

我想了解java实际上是在多核CPU中并行运行多个线程,或者线程之间有上下文切换,只有一个线程处于活动状态,而其他线程正在等待轮到它们运行。

换句话说,是否有可能并行运行2个线程?

因为我的Thread.currentThread()没有给我一个线程数组,只有一个线程正在运行。 那么事实是,只有一个线程一次运行而其他线程同时运行或多个线程可以并行运行,如果是,那么为什么我的Thread.currentThread()方法只返回一个线程对象。

编辑:.....

我创建了2个类来计算数字 1个类是同步进行的,另一个是将它分成两半并在2个线程中执行两半..(intel i5(4个CPU),8GB ram) 代码如下:

普通班:

class  Answer{
long ans = 0L;}

多线程执行: 公共类Sheet2 {

public static void main(String[] args) {

    final Answer ans1 = new Answer();
    final Answer ans2 = new Answer();


    Thread t1 = new Thread(new Runnable() {

        @Override
        public void run() {
            for(int i=0;i<=500000; i++) {
                ans1.ans = ans1.ans + i;
            }
        }
    });

    Thread t2 = new Thread(new Runnable() {

        @Override
        public void run() {
            for(int i=500001;i<=1000000; i++) {
                ans2.ans = ans2.ans + i;
            }
        }
    });
    long l1 = System.currentTimeMillis();

    try {
        t1.start();t2.start();
        t1.join();
        t2.join();
        long l2 = System.currentTimeMillis();
        System.out.println("ans :" + (ans1.ans + ans2.ans) +" in "+(l2-l1) +" milliseconds"); 
    } catch (InterruptedException e) {
        e.printStackTrace();
    }


}

}

单线程执行: 公共类Sheet3 {

public static void main(String[] args) {

    final Answer ans1 = new Answer();

    long l1 = System.currentTimeMillis();

    for(int i=0;i<=1000000; i++) {
        ans1.ans = ans1.ans + i;
    }
    long l2 = System.currentTimeMillis();

    System.out.println("ans :" + (ans1.ans ) +" in "+(l2-l1) +" milliseconds"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

}

}

我的单线程执行比我的多线程执行要快,我虽然上下文切换最初会对执行产生开销,因此多线程执行输出较慢,现在我有多核CPU(4 CPU),但是在这个例子中,单线程执行仍然更快。

请你在这里解释一下这个场景......是因为我的其他进程占用了其他内核,因此我的线程没有并行运行并在CPU上执行时间切换???

请注意这个话题。 提前致谢。 干杯。!!!

5 个答案:

答案 0 :(得分:6)

简而言之,它确实在不同的线程上运行。您可以通过创建100个线程并检入您的进程资源管理器来测试它,它会说100个线程。此外,您可以在每个线程中进行一些计算,您将看到您的多核处理器的使用率达到100%。

Thread.currentThread为您提供正在运行的当前线程。 当您启动程序时,您正在“主”线程上运行。 一旦你开始一个新的线程

new Thread(myRunnable);

位于myRunnable中的任何代码都将在新线程上运行,而当前线程仍位于主线程上。

如果你查看了API http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html,它会给出更详细的线程描述。

答案 1 :(得分:4)

实际的线程机制可能因CPU架构而异。但真正的问题是你错误地解释了方法名称。 Thread.currentThread()不会返回当前时刻执行的线程;它返回当前正在执行方法调用的线程,即它本身。

答案 2 :(得分:2)

是的。在多个线程上运行任何简单的无限循环,你会看到cpu的使用&gt; 100%在多核CPU上。

答案 3 :(得分:1)

是的,它确实同时运行线程。这就是多线程概念的目的。您可能会发现以下讨论有用: Current Thread Method java

答案 4 :(得分:0)

这里不是一个完整的答案,只是添加其他人已经说过的话:

Java语言规范不要求线程并行运行,但它允许它们这样做。在任何给定的Java虚拟机中实际发生的事情取决于JVM的实现方式。

任何实用的JVM都会为每个Java线程创建一个“本机”(即操作系统)线程,并让操作系统负责调度,锁定,等待,通知,......

相关问题