CPU双核和单核的执行java的多线程时有什么区别

这个程序跟单双核没什么关系,虽然单双核对多线程有影响。main的线程是独立于两个子线程,2个子线程互斥不会影响main线程的运行,线程的意义就是让程序“看起来”并发执行(单核一般是时间片轮转,多核的情况比较复杂,但基本可以看作是每个核运行不同线程),就是说main在创建完2个线程后,其线程不会...
CPU双核和单核的执行java的多线程时有什么区别
你应该多试几次,你会发现main函数的println的内容出现的位置是不定的!因为main函数所属的线程和Consumer构造的线程和Producer线程都是Runabble的啊。
我们为什么需要线程同步,synchronized标识、concurrent包这些,线程同步控制和单CPU、多CPU是没有关系的,不过concurrent包用到的CAS指令是需要现代CPU支持的。

------------------------ 看了shalooloowf回答后的补充

多CPU相对于单CPU的执行效率不是简单的叠加关系,因为不光进程调度需要资源,线程调度也是需要资源的。对于不同的应用场景有不同的选择策略,譬如计算密集型,我们通常在一个有N个CPU的机器上,选择创建N+1个线程来获得最高的利用率。具体可以参见《JAVA并发编程实践》一书。2010-07-20
这个程序跟单双核没什么关系,虽然单双核对多线程有影响。
main的线程是独立于两个子线程,2个子线程互斥不会影响main线程的运行,线程的意义就是让程序“看起来”并发执行(单核一般是时间片轮转,多核的情况比较复杂,但基本可以看作是每个核运行不同线程),就是说main在创建完2个线程后,其线程不会等待子线程,依然继续运行,即执行下面的输出语句,但是2个子线程也已经创建完毕,由于互斥,先执行put,但是先调main还是先调Producer 完全是由jvm决定的,所以才需要程序员对线程的执行顺序进行控制。如果你非要让main在子线程之后才运行输出语句,可以使用join方法等待线程执行完毕,我把代码修改了一下,可以让main中的输出在最后执行。
class Q {
int n;
boolean valueSet=true;

synchronized void put(int n) {
if(!valueSet)
try{
wait();
}catch(InterruptedException e){
System.out.println("Interrupted exception caught.");
}
this.n = n;
System.out.println("Put: " + n);
valueSet=false;
notify();
}

synchronized int get() {
if(valueSet)
try{
wait();
}catch(InterruptedException e){
System.out.println("Interrupted exception caught.");
}
System.out.println("Got: " + n);
valueSet=true;
notify();
return n;
}
}
//======================================================
class Producer implements Runnable {
Q q;

Producer(Q q) {
this.q = q;
// new Thread(this, "Producer").start();
}

public void run() {
int i = 0;
// while(true) {
for(int m=15;m>0;m--)
q.put(i++);
// }
}
}
//======================================================
class Consumer implements Runnable {
Q q;

Consumer(Q q) {
this.q = q;
// new Thread(this, "Consumer").start();
}

public void run() {
// while(true) {
for(int m=15;m>0;m--)
q.get();
// }
}
}
//======================================================
public class PC {

public static void main(String args[]) {
Q q = new Q();
Thread p=new Thread(new Producer(q)); //我需要得到2个线程的引用,所以不再构造函数里创建线程
Thread c=new Thread(new Consumer(q));
p.start();
c.start();
try {
p.join();//等待线程终止
c.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Press Control-C to stop.");
}
}
//======================================================

我也只是个初学者着啦,有什么问题可以共同探讨2010-07-20
cpu是用来处理程序的 一个处理的频率没有两个快

Press Control-C to stop.
Put: 0
Got: 0
Put: 1
Got: 1
这个是输出语句之前 同时执行线程 但是输出语句快了一点 因为到达输出比put方法要快 当双核的时候 就会同时分开执行这俩线程了
执行到启动第二个线程的时候 另外一个内核已经执行完第一个线程的put方法了2010-07-20
如果不同步的话线程的执行是没有规律可言的,甚至于顺序也会发生变化,这都是正常现象
补充----------------------------
线程启动后什么时候开始执行就是虚拟机什么时候分配给其资源的问题了,并不跟语句顺序有绝对关系2010-07-20
进程并发是只 多个进程在使用有限的资源(cpu,内存,其他硬件)存在的并发关系
如 一台计算机上的使用多个QQ。

线程并发一般来说是相对于单一指令。也是说在使用有限的资源(cpu,内存,其他硬件)存在的并发关系
1, 100+100
2, 100+200
3, 100+300
4, 100+400
如果执行一条指令需要一秒的话,那么在一台计算机,1个cpu处理的情况下。上述执行时间需要4秒(1个cpu同时只能处理一条指令)。如果4个cpu的话。那么只需要1秒(1个cpu同时只能处理一条指令。但是我有4个cpu在同时工作)2010-07-20
mengvlog 阅读 33 次 更新于 2025-09-10 07:36:04 我来答关注问题0
  •  誉祥祥知识 能运行Java的电脑的最低配置

    对于想要运行Java程序的电脑,最低配置要求是512MB内存和单核CPU,频率至少达到2.4GHz,这样的配置可以确保程序运行流畅。然而,对于追求更高性能和体验的用户来说,升级到双核CPU并增加至1GB内存,将会带来显著的性能提升,使得Java程序运行更加顺畅。Java的跨平台特性意味着,无论是在Windows、Linux还是macO...

  •  在西林塔看西甲的榛子 我的世界电脑版(Java)是单核性能高好还是主频高好?

    不能一概而论。架构越先进,核心的晶体管数量越多,在更低的频率下反而能发挥出晶体管数量少的核心的更高频率的性能。你需要知道的是,原版MC是完全的单线程游戏,目前高版本只有钠系列对多线程优化有一点用处(核心任务处理的用处几乎没有,例如红石,机器大了,该卡还是很卡)。就假如用手机来启动J...

  • 10. 能运行Java的电脑的最低配置 我以前刚刚学JAVA的时候,用的myeclipse6.0+oracle9i+tomcat,电脑配置是512MB内存,单核CPU(2.4GHZ),偶尔有点卡,但是整体还是运行流畅,我想这就是最低配置了吧。主要是内存和CPU一般的就可以了,随便来来个双核+1G内存条,毫无压力了。

  •  北大青鸟志远科技 Java多线程问题总结?

    (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的”多线程”那是假的多线程,同一时间处理器只会处理一段逻辑,只...

  •  星知魂 java高手:多线程运行设置优先级,我的电脑是双核的,不能正常显示结果。

    两个核心,就有两个时间片,可以实现两个线程的并发执行!只有一个核心,才会出现,优先级别高的先完成!线程的优先级,尽管能更好的管理你的程序,但这不符合java编程的要去,java要求线程同级别,这样的java程序才是优秀的!

檬味博客在线解答立即免费咨询

编程相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部