2 a305985895 a305985895 于 2015.06.11 14:50 提问

问各位大神一个多线程的问题

import java.util.Date;

public class TimePrinter extends Thread{
String mizi;
public TimePrinter(String name){
mizi=name;
}

public void run() {

        try {
            for (int i = 0; i < 32767; i++) {
                System.out.println(mizi+i);
                sleep(1);
            }

        } catch (Exception e) {
            // TODO: handle exception
        }
    }

public static void main(String[] args) {
    TimePrinter tp1=new TimePrinter("线程111111111111 ");
    tp1.start();
    TimePrinter tp2=new TimePrinter("线程222222222222 ");

    tp2.start();
}

}
运行结果是
线程111111111111 0
线程222222222222 0
线程111111111111 1
线程222222222222 1
线程111111111111 2
线程222222222222 2
线程222222222222 3
线程111111111111 3
线程222222222222 4
线程111111111111 4
线程222222222222 5
线程111111111111 5
线程222222222222 6

线程1和线程2,有时是线程一先出现有时是线程二先出现,我不太明白这是单核的多线程的时间片轮转所以导致1,2线程出现的先后顺序随机么?我的电脑是i7正常来讲这些线程不是应该跑在两个核心里么,如果是跑在两个核心里,他们出现的先后顺序应该是什么样的呢,求各位大神指导啊

3个回答

gamefinity
gamefinity   Rxr 2015.06.11 15:05
  • 没有先后顺序。或者说是完全随机的。要知道系统不单单只有你这两个线程在跑,还有很多其他的应用的其他线程在跑。因此并不是因为你多核,所以两个线程就理所当然的分在两个核里。
  • 要确定线程的执行顺序,只有通过同步机制来控制
a305985895
a305985895 多谢大神,那就是说这种线程应该是分配到了同一个核里按照时间片轮转的先来先调度,是这个意思么
2 年多之前 回复
danielinbiti
danielinbiti   Ds   Rxr 2015.06.11 15:11

实际这个代码打印什么方式都有可能,不一定是一对对出现。关键是sleep(1);这句话,两个线程同时sleep,被同时先后唤醒的概率比较高。所以两个同步执行看起来是同步的,但如果线程多了或者资源占用大了,这个概率就会降低。比如你这里起10个线程,估计结果就完全不是你想像的了。

danielinbiti
danielinbiti 回复a305985895: 没规律,双核你可以认为是两个应用同时在运行。相当于进程的效果
2 年多之前 回复
a305985895
a305985895 大神我还想问一个理论的问题,如果理论上两个线程恰好占用两个核心,正常来讲应该是同时调度吧,如果程序依旧这么写,那哪个线程先打印这个有规律么
2 年多之前 回复
tongyi55555
tongyi55555   2015.06.11 15:44

下面是跑完的结果。i5 win7 1.6JDK;
danielinbiti说的对,同时唤醒的概率高一些,而真正是谁先运行就不一定了,受系统调配策略影响。

线程222222222222 32763
线程111111111111 32753
线程111111111111 32754
线程222222222222 32764
线程111111111111 32755
线程222222222222 32765
线程111111111111 32756
线程222222222222 32766
线程111111111111 32757
线程111111111111 32758
线程111111111111 32759
线程111111111111 32760
线程111111111111 32761
线程111111111111 32762
线程111111111111 32763
线程111111111111 32764
线程111111111111 32765
线程111111111111 32766
tongyi55555
tongyi55555 回复a305985895: 说明一下,我们这里用唤醒不是很好,因为sleep之后的状态JAVA核心技术称之为可运行,而进入可运行状态的线程还收到操作系统调度器的影响,可运行并不一定在运行。我们电脑有多个CPU,如果只有你这两个线程,那同时结束sleep后应该是同时打印的,但是这是理想状况,现实不可能出现。
2 年多之前 回复
a305985895
a305985895 多谢,其实我更想知道我提的后一个问题,同时唤醒的话打印的次序会受什么影响
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片