线程与双核cpu

java_迷 2011-03-31 03:35:51
java中main为主线程,也可以增加线程。如果程序中有多个线程。
1、这些线程是怎样调用执行的呢?
2、几个线程顺序是怎样的,与什么有关?(我们可以通过方法设置线程的优先级,顺序和优先级有关吗?)
3、先运行谁,后运行谁?又取决于什么?
...全文
351 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
java_迷 2011-04-10
  • 打赏
  • 举报
回复
结合操作系统的知识。我已经理解到一点。线程在交个系统调度后。就由系统调配了。先后和优先级没有关系。
ZangXT 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 liyu1006 的回复:]

四楼和三楼说的不一样,三楼说的是双核CPU在同一时间点也只能执行一个线程,只是时间很快。而四楼说在同一时间点可以执行两个线程。那什么说法正确呢?请高手解答!
[/Quote]
每个CPU可以执行一个单独的线程。具体情况要看os如何调度了
Ganymede 2011-04-03
  • 打赏
  • 举报
回复
至于线程执行的先后,操作系统有一定的调度原则,我记得大二期末时我们还考了这道题,不过很基础,现在的CPU不知道是不是这样的策略
FIFO 先入先出原则.首先请求服务的对象首先得到CPU的处理.
最短作业优先原则:需要最小时间的服务首先得到处理.
最高优先级原则:优先级最高的服务首先得到处理.
时间轮片原则: 每个任务分配一个系统时间片.轮流执行.
最短剩余时间优先原则.
alan0791 2011-04-03
  • 打赏
  • 举报
回复
按启动顺序,然后就是服从调度了。
huhk 2011-04-03
  • 打赏
  • 举报
回复
一个CPU同一时间点只能执行一个线程。
由于有两个CPU,故可同时执行两个线程。具体的调度是OS设定的可以保证程序的正常。
liyu1006 2011-04-03
  • 打赏
  • 举报
回复
四楼和三楼说的不一样,三楼说的是双核CPU在同一时间点也只能执行一个线程,只是时间很快。而四楼说在同一时间点可以执行两个线程。那什么说法正确呢?请高手解答!
Ganymede 2011-04-03
  • 打赏
  • 举报
回复
针对9楼的问题
单核处理器实际上采用了超线程技术,理论上就像多线程一样,并行运作,实际上,只是在一个CPU里面多加了一个逻辑处理单元,但是整数运算单元,浮点运算单元,二级缓存都是共享的,所以一旦两个线程遇到一个资源的时候就必须停止其中一个,等待另外一个执行完才可以继续执行。也就是说单核CPU没有做到资源的共享。
但是双核处理器就不一样了,每个核心都有自己独立的指令集,执行单元,所以实实在在的实现了两个线程并行工作。举个例子吧,单核CPU就像一个人有一个大脑两个小脑,而双核CPU就是一个人有两个大脑
ZangXT 2011-04-03
  • 打赏
  • 举报
回复
线程的执行和顺序等问题是操作系统负责的,java不管。
Ganymede 2011-04-03
  • 打赏
  • 举报
回复
如果是双核CPU的话 那么就真正的实现了多线程。一般在JAVA里就是 new 一个Thread对象,然后start就可以开启这一线程了,至于执行的先后顺序,不确定,即便是设置了优先级也不能确定执行的顺序,优先级高的只能说被执行的几率比较大一点而已,所以宏观上看貌似优先级高的总是先被执行的。
liuxuejin 2011-04-02
  • 打赏
  • 举报
回复
mark!双核的话,的确是可以同时运行两个线程的
智鹿软件 2011-03-31
  • 打赏
  • 举报
回复

package thread;

public class ProducerAndCustomerDemo {
public static void main(String[] args) {
Queue q=new Queue();
Productor p=new Productor(q);
Customer c=new Customer(q);
p.start();
c.start();
}
}
class Customer extends Thread{
Queue q;
public Customer(Queue q) {
// TODO Auto-generated constructor stub
this.q=q;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (q.value<10) {
System.out.println("Customer get "+q.get());
}
}
}
class Productor extends Thread{
Queue q;
public Productor(Queue q) {
// TODO Auto-generated constructor stub
this.q=q;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 1; i <=10; i++) {
q.put(i);
System.out.println("Productor put "+i);
}
}
}
class Queue{
int value;
boolean bFull=false;
public synchronized void put(int i){
if (!bFull) {
value=i;
bFull=true;
//notify();
notifyAll();
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public synchronized int get(){
if (!bFull) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
bFull=false;
notifyAll();
return value;
}
}
Gray_Sky 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 heilinshuguang 的回复:]
现在的双核cpu是怎么回事呢?同一个时间点能否运行两个或多个线程?
[/Quote]

线程是需要得到处理器分给的时间片才能执行的,

线程执行是没有确定顺序的,优先级及一些方法也只是改变执行的几率而已。

先运行谁、后运行谁没有确定的顺序。不同的环境(比如不同的操作系统)调度方式都不同,所以不能确定。

传统的单核cpu在一个时间点上只能运行一个线程,而双核理论上可以同时运行两个线程。
jsut_yi 2011-03-31
  • 打赏
  • 举报
回复
双核就是两个处理器,每个处理器单位时间内只能执行一个线程,但是多线程情况下,cpu调度的速度非常快,感觉就像同时执行多个线程一样。实际上是一次执行一个。而每个线程,不管你优先级有多高都是一种"抢占"的方式。不能确定cpu下一次一定执行哪一个线程。
java_迷 2011-03-31
  • 打赏
  • 举报
回复
现在的双核cpu是怎么回事呢?同一个时间点能否运行两个或多个线程?
zn85600301 2011-03-31
  • 打赏
  • 举报
回复
new Thread 然后 strat

下来就是看CPU执行时间 随机分配~~

你写个例子 打印输出 看下就知道了 多跑几次 结果都不一样

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧