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正常来讲这些线程不是应该跑在两个核心里么,如果是跑在两个核心里,他们出现的先后顺序应该是什么样的呢,求各位大神指导啊
实际这个代码打印什么方式都有可能,不一定是一对对出现。关键是sleep(1);这句话,两个线程同时sleep,被同时先后唤醒的概率比较高。所以两个同步执行看起来是同步的,但如果线程多了或者资源占用大了,这个概率就会降低。比如你这里起10个线程,估计结果就完全不是你想像的了。
下面是跑完的结果。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