Java实际上是并行运行线程吗
我想了解,java实际上是在多核CPU中并行运行多个线程,还是线程之间存在上下文切换,只有一个线程处于活动状态,其他线程正在等待轮到它们运行 换句话说,有没有可能两个线程并行运行 因为我的Thread.currentThread()没有给我一个线程数组,而是只给我一个正在运行的线程。 那么事实是什么呢,当其他线程等待时,一次只运行一个线程,或者多个线程可以并行运行,如果是,那么为什么我的thread.currentThread()方法只返回一个thread对象呢 编辑: 我创建了两个类来计算数字 一个类同步执行,另一个类将其分为两半,并在2个线程中执行两半。(英特尔i5(4个CPU),8GB ram) 代码如下: 普通类:Java实际上是并行运行线程吗,java,multithreading,jakarta-ee,parallel-processing,Java,Multithreading,Jakarta Ee,Parallel Processing,我想了解,java实际上是在多核CPU中并行运行多个线程,还是线程之间存在上下文切换,只有一个线程处于活动状态,其他线程正在等待轮到它们运行 换句话说,有没有可能两个线程并行运行 因为我的Thread.currentThread()没有给我一个线程数组,而是只给我一个正在运行的线程。 那么事实是什么呢,当其他线程等待时,一次只运行一个线程,或者多个线程可以并行运行,如果是,那么为什么我的thread.currentThread()方法只返回一个thread对象呢 编辑: 我创建了两个类来计算数字
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$
}