Java是否实际并行运行线程

Arg*_*jee 3 java parallel-processing multithreading java-ee

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

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

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

编辑:.....

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

普通班:

class  Answer{
long ans = 0L;}
Run Code Online (Sandbox Code Playgroud)

多线程执行:公共类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();
    }


}
Run Code Online (Sandbox Code Playgroud)

}

单线程执行:公共类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$

}
Run Code Online (Sandbox Code Playgroud)

}

我的单线程执行比我的多线程执行快,我虽然上下文切换最初在执行上花费了开销,因此多线程执行输出较慢,现在我有多核CPU(4 CPU),但仍然是单线程在这个例子中执行速度更快..

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

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

Lud*_*ger 6

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

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

new Thread(myRunnable);

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

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


shm*_*sel 5

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