关于多线程的一点问题
因为刚学习java不久,对于多线程有一点不解,就是如果各个线程的优先级如果一样的话(包括主线程),那么如果主线程和其他线程同时为就绪状态,当然此时有一个线程在运行,当这个线程处于阻塞状态时,究竟是主线程还是其他线程成为运行状态?下面有一段代码,为何主线程不能在当前线程处于阻塞状态时开始运行,而一定要等待两个线程运行结束,主线程睡眠时间无论多少都会等待其他线程运行结束吗,为什么会是这样?如果不想让主线程等待的话该怎样做呢,请各位指点
package occupycpu;
public class Machine extends Thread{
private static StringBuffer log=new StringBuffer();
private static int count=0;
public void run(){
for(int a=0;a<20;a++){
log.append(currentThread().getName()+":"+a+" ");
if(++count %10==0)log.append("\n");
try{
sleep(100);
}catch(InterruptedException e){
throw new
RuntimeException(e);
}
}
}
public static void main(String args[])throws Exception{
Machine machine1=new Machine();
Machine machine2=new Machine();
machine1.setName("m1");
machine2.setName("m2");
machine1.start();
machine2.start();
while(machine1.isAlive() || machine2.isAlive())
Thread.sleep(5); //主线程睡眠5秒,等待machine1和machine2线程运行结束
System.out.println(log);
}
}
------解决方案--------------------其实多线程也是同一时间只有一个线程在运行
只不过是利用空闲时间切换运行提高效率的
真正意义的多线程是需要硬件支撑的
------解决方案--------------------machine1和machine2的线程状态并不是受到其它线程的影响的,除了正在sleep时状态为TIMED_WAITING外,for循环中状态为RUNNABLE的,也就是machine1和machine2可以同时处于RUNNABLE的,JVM是为自动为多个RUNNABLE的线程作调度的。
上述代码上,如果不想在main中使用while循环可以使用machine1.join();mainchine2.join()这样来直接等待两个线程的结束
------解决方案--------------------使用sychronized标记的话,它只是为了资源的互斥使用,并不能锁定线程啊!!!
我想用调用yeild()方法应该行的。
——————————————————————继续探讨,我也是初学者