你让那四个线程都执行setDaemon(true)方法,就可以了。

解决方案 »

  1.   

    public class ThreadTest
    {
       public static void main(String args[])
       {
            Thread thread1 = new Thread("thread1");
            Thread thread1 = new Thread("thread2");
            Thread thread1 = new Thread("thread1");
            Thread thread1 = new Thread("thread1");        thread1.start();
            thread2.start();
            thread3.start();
            thread4.start();        thread1.join();
            thread2.join();
            thread3.join();
            thread4.join();        System.err.println("threads end!");
        }
    }
    public final void join() throws InterruptedException
        Waits for this thread to die.
    Throws:
        InterruptedException - if another thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.
      

  2.   

    嗯,我是在做一个简单的抽奖程序,就是可以实现4个在JTextArea里的数字迅速滚动的效果,当用了cbhyk的方法以后,4个数字就没有以前滚动那么流畅了。。
    大家帮忙看看,非常简单的,大致程序如下:
    int result=1+(int)(Math.random()*9999);//这里其实结果已经产生了    //下面就是让数字滚动
        
        int digit1=result/1000;
        int digit2=result%1000/100;
        int digit3=result%1000%100/10;
        int digit4=result%1000%100%10;
        RandomNumberThread Thread1=new RandomNumberThread(numberArea1,
               Integer.parseInt(numberArea1.getText()),digit1);    RandomNumberThread Thread2=new RandomNumberThread(numberArea2,
            Integer.parseInt(numberArea2.getText()),digit2);
        RandomNumberThread Thread3=new RandomNumberThread(numberArea3,
            Integer.parseInt(numberArea3.getText()),digit3);
        RandomNumberThread Thread4=new RandomNumberThread(numberArea4,
            Integer.parseInt(numberArea4.getText()),digit4);    Thread1.start();
        Thread2.start();
        Thread3.start();
        Thread4.start();    model.addElement("恭喜你: "+Integer.toString(result));//在一个JList里输出结果
        要的就是当四个线程都执行完之后,JList里才输出结果
      

  3.   

    RandomNumberThread Thread2=new RandomNumberThread(numberArea2,
            Integer.parseInt(numberArea2.getText()),digit2);RandomNumberThread接收三个参数,一个是控制的JTextArea,一个是JTextArea里最初的内容,一个是JTextArea里滚动后要达到的内容
      

  4.   

    TO hq1305018(跃强):
      不知道为什么,用setDaemon(true)有个IllegalThreadStateException异常出现!
      

  5.   

    setDaemon(true)后线程成为守护线程,主线程一结束,守护线程自动就结束了。
      

  6.   

    你或者可以在每个RandomNumberThread设置一个标记位,当滚动完毕就更改标志,然后在主线程里每隔1秒检查一次完成没有,这样就不用join()了,但是效果怎么样要试试才知道
      

  7.   

    TO JavaVsNet(JavaVsNet)
      在主线程里反复判断是否滚动完成,我想可能还是会影响滚动效果吧,不管怎么说,试试先
      

  8.   

    1、join实际上线程还是一个个地在做没有同时进行。
    2、JavaVsNet是可行的方法,对速度影响可能小。可以用循环,在循环中加sleep。
      

  9.   

    55555555555555,还是不行啊,数字就不滚动了,直接跳到了最后的结果,
    代码如下    Thread1.start();
        Thread2.start();
        Thread3.start();
        Thread4.start();    while(true)
        {
          if (Thread1.isEnd() && Thread2.isEnd() && Thread3.isEnd() &&
              Thread4.isEnd())
          {
            SwingUtilities.invokeLater(new Runnable()
                                       {
                                         public void run()
                                         {
                                           model.addElement("恭喜你: " + Integer.toString(result));
                                         }
                                       });
            return;
          }
          else
          {
            try
            {
              Thread.sleep(100);
            }
            catch(Exception event)
            {        }
          }    }
      

  10.   

    我也遇到过和楼主一样的问题,而且我的线程比楼主还多,几百个,如果象 cbhyk() 那样就很麻烦,加之我的线程会在程序运行当中根据情况由其他线程动态产生,所以循环也不行!一直没能很好解决!
     
       hq1305018(跃强)的方法是不对的,setDaemon(true)是main()可以不管线程是否完成就结束,也强行结束可能还在alive的线程。   如果楼主是单CPU,就不要线程了吧,效率提高不了多少。这样就能顺序执行了!个人觉得是目前比较好的解决办法。
      

  11.   

    嗯,谢谢深山含笑兄。
    四个数字要滚动只有用循环,为了让四个数字能互不影响的滚动,而且四个数字要滚动到不同的结果,也就是说循环次数也不一样,如果不用线程怎么行???如果实在解决不了,只有将就交了。
    虽然抽奖结果已经在JList里出来了,四个数字还在装模做样的滚动虚伪了点~
      

  12.   

    是否可用isAlive()函数
    ....
    boolean bEnd = false;
        Thread1.start();
        Thread2.start();
        Thread3.start();
        Thread4.start();
    while (!bEnd) {
    try
    {Thread.sleep(1000);}
    catch(Exception e)
    {System.out.println(e.getMessage());}    
    if (!Thread1.isAlive() && !Thread2.isAlive() && !Thread3.isAlive() && !Thread4.isAlive() ) {
    System.out.println("main end");
    bEnd = true;
    }
    }
      

  13.   

    有个比较BT的建议,把你的每个滚动循环编号,然后每次出一个1-4之间的随机数,是几就执行几号循环。这样就可以单线程了。:)不过不懂你这个应用为什么要等所有的线程全部执行完,应该是 有一个“停”的按钮。一点就所有滚动全部停止,可以调用thread.stop()强制停止所有线程,这样就随机产生一个号啦!
      

  14.   

    嗯,这样吧,我把代码发出来给大家看看:  在JBuilder9下运行通过,遇到的问题就是结果在数字滚动停止之前就在JList里出来了:
    import javax.swing.*;
    import java.awt.*;import java.awt.event.*;
    import com.borland.jbcl.layout.*;
    public class MainFrame extends JFrame{
      JPanel jPanel1 = new JPanel();
      JPanel jPanel2 = new JPanel();
      JPanel jPanel3 = new JPanel();
      JTextArea numberArea1 = new JTextArea();
      JTextArea numberArea2 = new JTextArea();
      JTextArea numberArea3 = new JTextArea();
      JTextArea numberArea4 = new JTextArea();  JButton beginButton = new JButton();
      JButton clearNumber = new JButton();
      JButton clearAll = new JButton();
      FlowLayout flowLayout1 = new FlowLayout();  BorderLayout borderLayout1 = new BorderLayout();
      JPanel jPanel4 = new JPanel();
      JScrollPane jScrollPane1 = new JScrollPane();
      DefaultListModel model=new DefaultListModel();
      JList resultList = new JList(model);
      BorderLayout borderLayout2 = new BorderLayout();
      GridBagLayout gridBagLayout1 = new GridBagLayout();
      GridBagLayout gridBagLayout2 = new GridBagLayout();  public MainFrame() {
        try {
          jbInit();
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }
      private void jbInit() throws Exception {
        this.getContentPane().setLayout(borderLayout1);
        jPanel1.setForeground(Color.lightGray);
        jPanel1.setBorder(null);
        jPanel1.setLayout(gridBagLayout2);
        jPanel3.setLayout(gridBagLayout1);
        beginButton.setText("开始抽奖");
        beginButton.addActionListener(new MainFrame_beginButton_actionAdapter(this));
        clearNumber.setText("数字复位");
        clearNumber.addActionListener(new MainFrame_clearNumber_actionAdapter(this));
        clearAll.setText("主复位");
        clearAll.addActionListener(new MainFrame_clearAll_actionAdapter(this));
        numberArea1.setFont(new java.awt.Font("Monospaced", 1, 70));
        numberArea1.setText("0");
        numberArea1.setName("numberArea1");
        numberArea1.setEditable(false);
        numberArea1.setLineWrap(false);
        numberArea2.setFont(new java.awt.Font("Monospaced", 1, 70));
        numberArea2.setText("0");
        numberArea2.setName("numberArea2");
        numberArea2.setEditable(false);
        numberArea3.setFont(new java.awt.Font("Monospaced", 1, 70));
        numberArea3.setText("0");
        numberArea3.setEditable(false);
        numberArea3.setName("numberArea3");
        numberArea4.setFont(new java.awt.Font("Monospaced", 1, 70));
        numberArea4.setText("0");
        numberArea4.setName("numberArea4");
        numberArea4.setEditable(false);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setForeground(Color.lightGray);
        this.setTitle("现场抽奖");
        jPanel3.setBorder(BorderFactory.createLoweredBevelBorder());
        jPanel2.setBackground(Color.lightGray);
        jPanel2.setBorder(null);
        jPanel2.setDebugGraphicsOptions(0);
        jPanel2.setLayout(flowLayout1);
        jPanel4.setLayout(borderLayout2);
        jPanel2.add(beginButton, null);
        jPanel2.add(clearNumber, null);
        jPanel2.add(clearAll, null);
        this.getContentPane().add(jPanel1,  BorderLayout.CENTER);
        jPanel3.add(numberArea2,  new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0
                ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(63, 0, 73, 0), -1, -3));
        jPanel3.add(numberArea4,  new GridBagConstraints(3, 0, 1, 1, 1.0, 1.0
                ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(63, 0, 73, 67), -1, -3));
        jPanel3.add(numberArea3,  new GridBagConstraints(2, 0, 1, 1, 1.0, 1.0
                ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(63, 0, 73, 0), -1, -3));
        jPanel3.add(numberArea1,  new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0
                ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(63, 53, 73, 0), -1, -3));
        jPanel1.add(jPanel4,       new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0
                ,GridBagConstraints.CENTER, GridBagConstraints.VERTICAL, new Insets(0, 0, 0, 0), 110, 102));
        jPanel4.add(jScrollPane1, BorderLayout.CENTER);
        jScrollPane1.getViewport().add(resultList, null);
        jPanel1.add(jPanel3, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0
                ,GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new Insets(0, 0, 0, 0), 0, 0));
        this.getContentPane().add(jPanel2, BorderLayout.SOUTH);
      }  void beginButton_actionPerformed(ActionEvent e) {    final int result=1+(int)(Math.random()*9999);
        System.out.println(result);
        int digit1=result/1000;
        int digit2=result%1000/100;
        int digit3=result%1000%100/10;
        int digit4=result%1000%100%10;
        RandomNumberThread Thread1=new RandomNumberThread(numberArea1,
               Integer.parseInt(numberArea1.getText()),digit1);    RandomNumberThread Thread2=new RandomNumberThread(numberArea2,
            Integer.parseInt(numberArea2.getText()),digit2);
        RandomNumberThread Thread3=new RandomNumberThread(numberArea3,
            Integer.parseInt(numberArea3.getText()),digit3);
        RandomNumberThread Thread4=new RandomNumberThread(numberArea4,
            Integer.parseInt(numberArea4.getText()),digit4);    Thread1.start();
        Thread2.start();
        Thread3.start();
        Thread4.start();          model.addElement("恭喜你:"+Integer.toString(result));
      }  void clearNumber_actionPerformed(ActionEvent e) {
        numberArea1.setText("0");
        numberArea2.setText("0");
        numberArea3.setText("0");
        numberArea4.setText("0");  }  void clearAll_actionPerformed(ActionEvent e) {
        numberArea1.setText("0");
        numberArea2.setText("0");
        numberArea3.setText("0");
        numberArea4.setText("0");
        model.clear();  }
    }class MainFrame_beginButton_actionAdapter implements java.awt.event.ActionListener {
      MainFrame adaptee;  MainFrame_beginButton_actionAdapter(MainFrame adaptee) {
        this.adaptee = adaptee;
      }
      public void actionPerformed(ActionEvent e) {
        adaptee.beginButton_actionPerformed(e);
      }
    }class MainFrame_clearNumber_actionAdapter implements java.awt.event.ActionListener {
      MainFrame adaptee;  MainFrame_clearNumber_actionAdapter(MainFrame adaptee) {
        this.adaptee = adaptee;
      }
      public void actionPerformed(ActionEvent e) {
        adaptee.clearNumber_actionPerformed(e);
      }
    }class MainFrame_clearAll_actionAdapter implements java.awt.event.ActionListener {
      MainFrame adaptee;  MainFrame_clearAll_actionAdapter(MainFrame adaptee) {
        this.adaptee = adaptee;
      }
      public void actionPerformed(ActionEvent e) {
        adaptee.clearAll_actionPerformed(e);
      }
    }
      

  15.   

    import javax.swing.*;public class RandomNumberThread extends Thread{  private JTextArea numberArea;
      private int initNumber;
      private int finalNumber;
      private int times;  public RandomNumberThread(JTextArea textArea,int number1,int number2)
      {
        super("RandomNumberThread: "+textArea.getName());
        numberArea=textArea;
        initNumber=number1;
        finalNumber=number2;
        if(number1<=number2)
           times=41+Math.abs(number1-number2);
           else
             times=41-Math.abs(number1-number2);  }  public void run()
      {
          int j=initNumber;
          for(int i=0;i<times;i++)
          {
            try
            {
              Thread.sleep(10);
            }
            catch(InterruptedException e)
            {
              System.err.println(e.toString());
            }
            SwingUtilities.invokeLater(new ChangeNumber(numberArea,j));
            j++;
            if(j>=10)
              j=0;
          }  }
    private class ChangeNumber implements Runnable
    {
      private String numberToDisplay;
      private JTextArea displayArea;
      public ChangeNumber(JTextArea textArea,int number)
      {
        numberToDisplay=Integer.toString(number);
        displayArea=textArea;
      }
      public void run()
      {    displayArea.setText(numberToDisplay);
      }
    }
    }
      

  16.   

    public class Lottery {  public static void main(String args[])
      {
        MainFrame mainFrame=new MainFrame();
        mainFrame.setSize(400,300);
        mainFrame.setResizable(false);
        mainFrame.setVisible(true);
      }}虽然看起来长了的,其实非常简单,在JBuilder里直接运行就可以了
    有什么不好的地方,请大家指教!