这个程序跟单双核没什么关系,虽然单双核对多线程有影响。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