import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JProgressBar;public class JoinTest extends JFrame{private Thread threadA;
private Thread threadB;
final JProgressBar progressBar = new JProgressBar();
final JProgressBar progressBar2 = new JProgressBar();
int count=0;
public static void main(String[] args) {
init(new JoinTest(),100,100);}public JoinTest() {
super();getContentPane().add(progressBar, BorderLayout.NORTH);
getContentPane().add(progressBar2, BorderLayout.SOUTH);
progressBar.setStringPainted(true);
progressBar2.setStringPainted(true);
threadA=new Thread(new Runnable(){
int count=0;
public void run(){
while(true){
progressBar.setValue(++count);
try{
threadA.sleep(100);
threadB.join();
}catch(Exception e){
e.printStackTrace();
}
}
}
});
threadA.start();threadB=new Thread(new Runnable(){
int count=0;
public void run(){
while(true){
progressBar2.setValue(++count);
try{
threadB.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
if(count==100)
break;
}
}
});
threadB.start();
}
public static void init(JFrame frame,int width,int height){
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(width, height);
frame.setVisible(true);
}
}想问下,new JoinTest()之后将调用JoinTest的构造方法,在JoinTest的构造方法中,应该是顺序进行的。运行到threadA.start();这句时,调用threadA的run方法,在run方法里面有threadB.join();。问题就在这里!!!明明threadB.start();这句没有执行到,也就是说线程B没有进入就绪状态,可是为什么就能直接执行threadB.join();?麻烦各位解释下,给个文章看看也行java运行顺序java基础

解决方案 »

  1.   

    个人理解:
    1. 线程是基于cpu的时间片轮转的,所以说很快
    2. 程序中是先解释成字节码的,他会把要执行(不是被调用的)
       前边执行,也就是说他会执行A.start,在执行B.start
       很有可能A.start后就到B.start中去了,并且开始执行B的run方法中内容
       这时候就会出现你的情况
    3. 感觉可以先把B挂起,或者用CountDownLatch在A的run中把B释放,让他运行。
      

  2.   


    3楼的同学,我感觉第二条挺对的,能说具体点吗?我先去找找文章其实就是线程调度机制中调度先后的问题
    并不是start就代表他要先执行,内部机制是把start的线程加载带线程调度队列中去
    虽然队列是FIFO但是当A刚从队列中出来要执行的时候,B也出来了,cpu给A时间结束
    到给B的了,就出现执行B的run中内容,即使设置优先级也会出现的,但这不是绝对的
    毕竟cpu太快了,给线程时间也不是规定长度的。