java线程调用问题

来源:百度知道 编辑:UC知道 时间:2024/05/22 14:48:40
书上说了,java是抢占式调度线程的,以下例子证明,但如果把//System.out.println(Thread.currentThread().getName()+ ":"+ i);注释的去掉,在run里输出当前线程运行状况,结果跟前者有差别
public class Machine extends Thread{
private static StringBuffer s=new StringBuffer();
public void run(){
for(int i=0;i<10;i++){
s.append(currentThread().getName()+":"+ i+ "; ");
//System.out.println(Thread.currentThread().getName()+ ":"+ i);
}
}
public static void main(String args[]){
Machine machine=new Machine();
Thread t1=new Thread(machine);
Thread t2=new Thread(machine);
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive())
try{
Thread.sleep(500);
}catch(InterruptedException e){throw new RuntimeException(e);}
System.out.println(s);
}
}
//////////////////////////////////没去掉注释的输出结果////////////////
Thread-1:0; Thread-1:1; Thread-1:2; Thread-1:3; Thread-1:4; Thread-1

因为有IO了嘛(system.out.println),即便是抢占式的,当出现IO,CPU也会被让给在等待队列里的Thread2啊
至于为什么不是交替着出现可能就是因为抢占式,或者是JVM考虑了一些优先级的问题

正如你书上看到的所说,,java是抢占式调度线程的.所以正常我们应该看到的是第二种情况.

可是为什么会出现第一种情况呢?
其实第一种情况和第二种情况是差不多的.两边同时在进行append操作.但是最后输出时的结果肯定是增加的
如:
1.0,1.2,1.3,1.4
2.0.2.2,,2.3,2.4
第一种是因为你没有用System.out.println()
输出.只输出结果是因为两个线程是各跑各的不会受各自的影响的..
但是如果运气不好的话
还有可能是
2.0,2.1,2.2先输出哦
这就是JAVA的抢占式:)
要适应..
其实如果是共享状态的话,可以用synchronized控制