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基础
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基础
解决方案 »
- 用一个字符串转换成一个流,有兴趣的进来讨论一下!
- java.util.Arrays中的一个方法,有问题呀,你们觉得呢?
- 请各位大哥给个好办法,解决下这个java数组
- 能不能格式化数字的显示:数字1显示为01
- 奇怪的问题!想不明白!请各位赐教
- 如何调用自己打包的类
- 刚刚在JavaWorld上看到的一个帖子,人快到50了,想要成为程序员!
- print("//".matches("//"));我在Eclipse3.2中运行是true,但是在北京尚学堂马士兵的视频课程中,说是false,为什么?
- JAVA新手问PATH问题
- 当jtable在model的值改变后如何让jtable自动刷新以显示新的数据?
- Java 多线程典型的生产者与消费者问题,有些不理解,请指教。
- 关于javamail发送邮件
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太快了,给线程时间也不是规定长度的。