Java实际上是并行运行线程吗

Java实际上是并行运行线程吗,java,multithreading,jakarta-ee,parallel-processing,Java,Multithreading,Jakarta Ee,Parallel Processing,我想了解,java实际上是在多核CPU中并行运行多个线程,还是线程之间存在上下文切换,只有一个线程处于活动状态,其他线程正在等待轮到它们运行 换句话说,有没有可能两个线程并行运行 因为我的Thread.currentThread()没有给我一个线程数组,而是只给我一个正在运行的线程。 那么事实是什么呢,当其他线程等待时,一次只运行一个线程,或者多个线程可以并行运行,如果是,那么为什么我的thread.currentThread()方法只返回一个thread对象呢 编辑: 我创建了两个类来计算数字

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

换句话说,有没有可能两个线程并行运行

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

编辑:

我创建了两个类来计算数字 一个类同步执行,另一个类将其分为两半,并在2个线程中执行两半。(英特尔i5(4个CPU),8GB ram) 代码如下:

普通类:

class  Answer{
long ans = 0L;}
多线程执行: 公开课表格2{

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();
    }


}
publicstaticvoidmain(字符串[]args){
最终答案ans1=新答案();
最终答案ans2=新答案();
线程t1=新线程(新的可运行线程(){
@凌驾
公开募捐{

对于(int i=0;i是的。在多个线程上运行任何简单的无限循环,您将看到多核cpu上的cpu使用率>100%。

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

简而言之,它在单独的线程上运行。您可以通过创建100个线程并在process explorer中签入100个线程来测试它。您还可以在每个线程中进行一些计算阅读后,您将看到您的多核处理器达到100%的使用率

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

新线程(myRunnable);

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


如果您查看API,它会给出线程的更详细描述。

是的,它会同时运行线程。这正是多线程概念的目的。您可能会发现以下讨论很有帮助:
这里不是一个完整的答案,只是补充了其他人已经说过的内容:

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


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

你是否来自Python?Hi@vz0,不,我来自Java..!!:)如果是,那么为什么api线程是。currentThread(),只返回一个线程,是不是它只返回自己线程的引用,而不是所有正在执行的线程的引用。??我认为它会进行上下文切换,每个线程在执行操作时轮流执行…并在使用外部资源(如DB或IO)执行某些操作时将执行传递给其他线程.@ArghoChatterjee它返回正在执行对
thread.currentThread()调用的线程。
thread.currentThread()调用返回对正在执行函数调用的线程的引用。如果有许多线程执行相同的代码,则每个调用将返回不同的线程引用。感谢您在这里更正我。是的,我确实应该假设在多核(例如16核机器)中,在同一JVM中可以有2-3个线程并行运行并提高响应时间。?@ArghoChatterjee这是一个合理的假设。
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$

}