Java 实际上 运行 线程是并行的吗
Does Java actually run threads in parallel
我想了解 java 实际上 运行 多个线程在多核中并行 CPU,或者线程之间存在上下文切换并且只有一个线程处于活动状态其他人正在等待 运行.
换句话说,有没有可能2个线程是运行并行的???
因为我的Thread.currentThread() 没有给我一个线程数组,而是只有一个线程运行ning。
那么真相是什么,一次只有一个线程 运行 而其他线程等待或多个线程可以 运行 并行,如果是,那么为什么我的 Thread.currentThread() 方法 return 只有 1 个线程对象。
编辑:.....
我创建了 2 个 classes 来计算数字
1 class 同步执行,另一个将其分成两半并在 2 个线程中执行两半..(intel i5(4 CPUs),8GB ram)
代码如下:
常见 class :
class Answer{
long ans = 0L;}
多线程执行:
public class 工作表 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();
}
}
}
单线程执行:
public class 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),但在此示例中单线程执行仍然更快..
你能解释一下这里的情况吗...是不是因为我的其他进程正在吃掉其他内核,因此我的线程没有 运行 并行并在 [=48 上执行时间分片=] ???
请就此主题发表一些看法。
提前致谢。
干杯。!!!
是的。 运行 多个线程上的任何简单无限循环,您会看到 cpu 在多核 CPU.
上的使用率 > 100%
实际的线程机制可能因 CPU 体系结构而异。但真正的问题是您误解了方法名称。 Thread.currentThread()
不 return 线程在当前时刻执行; return是当前执行方法调用的线程,也就是它自己。
简而言之,是的,它在不同的线程上 运行。您可以通过创建 100 个线程并检查进程资源管理器来测试它,它会显示 100 个线程。你也可以在每个线程中做一些计算,你会看到你的多核处理器使用率达到 100%。
Thread.currentThread 为您提供 运行 所在的当前线程。
当您启动您的程序时,您 运行 正在 "main" 线程上。
只要你开始一个新线程
new Thread(myRunnable);
位于 myRunnable 中的任何代码都将 运行 在新线程上,而您的当前线程仍在主线程上。
如果您查看 API http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html,它会提供更详细的线程描述。
是的,它并发 运行 个线程。这就是多线程概念的真正目的。您可能会发现以下讨论很有帮助:
Current Thread Method java
这里没有完整的答案,只是补充其他人已经说过的内容:
Java 语言规范不要求线程运行并行,但允许它们这样做。在任何给定的 Java 虚拟机中实际发生的事情取决于 JVM 的实现方式。
任何实用的 JVM 都会为每个 Java 线程创建一个 "native"(即操作系统)线程,并让操作系统负责调度、锁定、等待、通知、.. .
我想了解 java 实际上 运行 多个线程在多核中并行 CPU,或者线程之间存在上下文切换并且只有一个线程处于活动状态其他人正在等待 运行.
换句话说,有没有可能2个线程是运行并行的???
因为我的Thread.currentThread() 没有给我一个线程数组,而是只有一个线程运行ning。 那么真相是什么,一次只有一个线程 运行 而其他线程等待或多个线程可以 运行 并行,如果是,那么为什么我的 Thread.currentThread() 方法 return 只有 1 个线程对象。
编辑:.....
我创建了 2 个 classes 来计算数字 1 class 同步执行,另一个将其分成两半并在 2 个线程中执行两半..(intel i5(4 CPUs),8GB ram) 代码如下:
常见 class :
class Answer{
long ans = 0L;}
多线程执行: public class 工作表 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();
}
}
}
单线程执行: public class 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),但在此示例中单线程执行仍然更快..
你能解释一下这里的情况吗...是不是因为我的其他进程正在吃掉其他内核,因此我的线程没有 运行 并行并在 [=48 上执行时间分片=] ???
请就此主题发表一些看法。 提前致谢。 干杯。!!!
是的。 运行 多个线程上的任何简单无限循环,您会看到 cpu 在多核 CPU.
上的使用率 > 100%实际的线程机制可能因 CPU 体系结构而异。但真正的问题是您误解了方法名称。 Thread.currentThread()
不 return 线程在当前时刻执行; return是当前执行方法调用的线程,也就是它自己。
简而言之,是的,它在不同的线程上 运行。您可以通过创建 100 个线程并检查进程资源管理器来测试它,它会显示 100 个线程。你也可以在每个线程中做一些计算,你会看到你的多核处理器使用率达到 100%。
Thread.currentThread 为您提供 运行 所在的当前线程。 当您启动您的程序时,您 运行 正在 "main" 线程上。 只要你开始一个新线程
new Thread(myRunnable);
位于 myRunnable 中的任何代码都将 运行 在新线程上,而您的当前线程仍在主线程上。
如果您查看 API http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html,它会提供更详细的线程描述。
是的,它并发 运行 个线程。这就是多线程概念的真正目的。您可能会发现以下讨论很有帮助: Current Thread Method java
这里没有完整的答案,只是补充其他人已经说过的内容:
Java 语言规范不要求线程运行并行,但允许它们这样做。在任何给定的 Java 虚拟机中实际发生的事情取决于 JVM 的实现方式。
任何实用的 JVM 都会为每个 Java 线程创建一个 "native"(即操作系统)线程,并让操作系统负责调度、锁定、等待、通知、.. .