黑马程序员技术交流社区

标题: JAVA线程 [打印本页]

作者: ~﹏~    时间: 2013-11-3 18:38
标题: JAVA线程
是这样的:
我要做一个上传文件的程序,它将某个文件夹中的文件要挨着盘的上传到FTP中
我做了一个类A,专门负责进度条
还有一个类B,负责上传一个文件,这个类放在线程中
我现在想的是,比如又是个文件,创建十个B,等前一个B线程结束之后再开启后一个B线程,不能同时开启,有条不紊的把十个文件上传上去

有人可能会问我:那不如在主函数中用for循环调用十次不就完了么;不行的,这样的话我的进度条类操作不了UI,界面就卡死了
所以我想问问大家有什么好的解决思路!谢谢!

作者: 回天之力    时间: 2013-11-3 18:55
楼主是高手啊  哈哈
作者: ~﹏~    时间: 2013-11-3 19:14
回天之力 发表于 2013-11-3 18:55
楼主是高手啊  哈哈

不是啊,还有好多东西需要学呢!一起努力把!
作者: 杨增坤    时间: 2013-11-3 22:08
本帖最后由 杨增坤 于 2013-11-3 22:11 编辑

switch(10){
  case 10:
                  开启线程1;
case 9:
                  开启线程2;
case 8:
                  开启线程3;
.
.
.
.
.
case 1:
       开启线程10;
}


这样可以吗??你试一试!  我明白你是,当一个线程结束后,就开启下一个线程,这得把线程的优先级调高一点,大于主函数的优先级!


作者: 黄小贝    时间: 2013-11-3 23:34
本帖最后由 黄小贝 于 2013-11-3 23:35 编辑

喔霍霍~让我来拯救世界~~用join呀~~直接上代码~~
大家可以自己跑一下~~十个文件依次上传~~
  1. import java.awt.BorderLayout;
  2. import java.awt.FlowLayout;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import javax.swing.*;

  6. public class TestProgress extends Thread implements ActionListener {
  7.         
  8.         private static JProgressBar progressBar;
  9.         
  10.         JFrame jf = new JFrame("Test");
  11.         JPanel jp = new JPanel();
  12.         JTextArea jta = new JTextArea();
  13.         JButton jb = new JButton("点击");
  14.         
  15.         public static void main(String[] args) {
  16.                 new TestProgress();
  17.         }

  18.         public TestProgress() {
  19.                 jp.setLayout(new FlowLayout());
  20.                 progressBar = new JProgressBar();
  21.                 progressBar.setValue(0);
  22.                 progressBar.setStringPainted(true);
  23.                
  24.                 jf.add(jp, BorderLayout.NORTH);
  25.                 jf.add(new JScrollPane(jta));
  26.                 jp.add(progressBar);
  27.                 jp.add(jb);
  28.                 jf.add(new JScrollPane(jta), BorderLayout.CENTER);
  29.                 jb.addActionListener(this);

  30.                 jf.setSize(300, 200);
  31.                 jf.setLocation(300, 200);
  32.                 jf.setVisible(true);
  33.                 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  34.         }
  35.         
  36.         @Override
  37.         public void run() {
  38.                 for (int i = 0; i < 10;i++) {//10个文件
  39.                         UpLordTread lordTread = new UpLordTread(progressBar,jta,"文件" + i);
  40.                         lordTread.start();//启动上传程序
  41.                         try {
  42.                                 lordTread.join();//这就是关键~~等待这个线程完成
  43.                         } catch (InterruptedException e) {
  44.                                 e.printStackTrace();
  45.                         }
  46.                 }
  47.         }


  48.         public void actionPerformed(ActionEvent e) {
  49.                 String comm = e.getActionCommand();
  50.                 if ("点击".equals(comm)) {
  51.                         this.start();//不能在EDT线程里面执行费时的操作,防止UI卡死
  52.                         jb.setEnabled(false);
  53.                 }

  54.         }

  55. }

  56. /**
  57. * 文件上传线程
  58. * @author yellowbaby
  59. *
  60. */
  61. class UpLordTread extends Thread{
  62.         
  63.         JTextArea jta;
  64.         JProgressBar progressBar;
  65.         
  66.         
  67.         public UpLordTread(JProgressBar progressBar,JTextArea jta,String fileName) {
  68.                 super(fileName);
  69.                 this.jta = jta;
  70.                 this.progressBar = progressBar;
  71.         }

  72.         public void run() {
  73.                 for (int i = 0; i <= 100; i++) {
  74.                         progressBar.setValue(i);
  75.                         String temp = Thread.currentThread().getName() + ":" + i + "\n";
  76.                         jta.append(temp);
  77.                         try {
  78.                                 Thread.sleep(10);
  79.                         } catch (Exception ee) {
  80.                                 ee.printStackTrace();
  81.                         }
  82.                 }
  83.                 progressBar.setValue(0);
  84.         }
  85.         
  86. }
复制代码
有几个知识点说一下

(1)join方法的作用,等待线程死去,当线程调用其他线程的join方法的时候线程会被阻塞,知道那个线程的run跑完,这样就可以解决十个文件依次上传的问题
(2)JProgressBar 是 java自带的进度条,我也是查了才知道,目测当progressBar的value被改变的时候会自动刷新界面,我没有验证,可以找到progressBar所有的valueChange监听看源码就可以知道了
(3)不要在EDT线程里面调用I/O操作,那样UI会卡死,什么是EDT线程自行谷歌,actionPerformed方法是在EDT里面跑的,有什么事情丢给背后线程去完成,我这里的背后线程就是this.start().......





作者: ~﹏~    时间: 2013-11-4 14:11
黄小贝 发表于 2013-11-3 23:34
喔霍霍~让我来拯救世界~~用join呀~~直接上代码~~
大家可以自己跑一下~~十个文件依次上传~~有几个知识点说一 ...

谢谢啊!
作者: 黄小贝    时间: 2013-11-4 17:55
~﹏~ 发表于 2013-11-4 14:11
谢谢啊!

互相学习




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2