relax_cat_another 2015-09-28 09:24 采纳率: 75%
浏览 1456
已采纳

新手求教,关于线程的问题

import java.awt.*;

import javax.swing.*;
public class Jointest extends JFrame{
Thread t1;
Thread t2;
JProgressBar p1=new JProgressBar();
JProgressBar p2=new JProgressBar();
public Jointest(){
getContentPane().add(p1,BorderLayout.NORTH);
getContentPane().add(p2,BorderLayout.SOUTH);
p1.setStringPainted(true);
p2.setStringPainted(true);
t1=new Thread(new Runnable(){
public void run(){
int count=0;
while(true){
p1.setValue(count++);
try{
Thread.sleep(100);
t2.join();
}catch(Exception e){
e.printStackTrace();
}
}
}
});
t1.start();
t2=new Thread(new Runnable(){
public void run(){
int count=0;
while(true){
p2.setValue(count++);
try{
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
if(count==101){
break;
}
}
}
});
t2.start();
}
public static void init(JFrame frame,int width,int height){
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(width,height);
frame.setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
init(new Jointest(),200,200);
}

}
这个程序为什么不能实现进度条p2每次都从0%到100%,同时对应进度条p1前进1%?线程t2只能被执行一次么?
另外,
Thread t1;
Thread t2;
JProgressBar p1=new JProgressBar();
JProgressBar p2=new JProgressBar();
这四句如果放在构造方法里就会报错,报错后把p1、p2的修饰符加上final就没问题了,但是t1、t2加了final还是不对,这是为什么啊。。

  • 写回答

2条回答 默认 最新

  • 毕小宝 博客专家认证 2015-09-29 06:15
    关注

    第一个问题,你的t1线程中执行了t2.join()这个方法,它的功能是"Waits for this thread to die."所以要等t2线程执行完成后t1线程才会继续。
    不是t2线程只执行一次,而是线程t2启动后,它的run方法开始执行,当run方法结束了,那么t2这个线程就销毁了。
    第二个问题,p1、p2的修饰符加上final才能被你定义的匿名线程访问,这是java的基本语法,匿名线程只能访问外部环境中的final变量。
    测试了你的代码,的确,虽然p1的value已经为1了,但是进度条上仍然是0.猜测可能是进度条类本身的特性,为什么值变化了不能立即可见呢?
    关注中。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办
  • ¥15 vue2登录调用后端接口如何实现