日期:2014-05-20  浏览次数:20735 次

java的一个基础问题,用的线程的例子,望各大牛能解答下
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. 线程是基于cpu的时间片轮转的,所以说很快
2. 程序中是先解释成字节码的,他会把要执行(不是被调用的)
   前边执行,也就是说他会执行A.start,在执行B.start
   很有可能A.start后就到B.start中去了,并且开始执行B的run方法中内容
   这时候就会出现你的情况
3. 感觉可以先把B挂起,或者用CountDownLatch在A的run中把B释放,让他运行。
------解决方案--------------------
引用:
Quote: 引用:

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


3楼的同学,我感觉第二条挺对的,能说具体点吗?我先去找找文章


其实就是线程调度机制中调度先后的问题
并不是start就代表他要先执行,内部机制是把start的线程加载带线程调度队列中去
虽然队列是FIFO但是当A刚从队列中出来要执行的时候,B也出来了,cpu给A时间结束
到给B的了,就出现执行B的run中内容,即使设置优先级也会出现的,但这不是绝对的
毕竟cpu太快了,给线程时间也不是规定长度的。