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上执行时间切片???
请注意这个话题.提前致谢.干杯.!!!
简而言之,它确实在不同的线程上运行.您可以通过创建100个线程并检入您的进程资源管理器来测试它,它会说100个线程.此外,您可以在每个线程中进行一些计算,您将看到您的多核处理器的使用率达到100%.
Thread.currentThread为您提供正在运行的当前线程.当您启动程序时,您正在"主"线程上运行.一旦你开始一个新的线程
new Thread(myRunnable);
位于myRunnable中的任何代码都将在新线程上运行,而当前线程仍在主线程上.
如果您查看API http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html,它会给出更详细的线程描述.
实际的线程机制可能因 CPU 架构而异。但真正的问题是您误解了方法名称。Thread.currentThread()不返回当前时刻执行的线程;它返回当前执行方法调用的线程,即它自己。