一个线程是不是只能调用一次start()方法?
我写了个记事本,保存较大文件时会卡住,所以我让写文件的类继承了Thread
在其run()方法里边执行写操作,每次保存文件都设置一下文件名和内容后执行start()方法。
这就牵扯出一个新问题,如果还没保存完程序被关闭了,就会丢失需要保存的部分内容。
所以我在System.Exit(0);之前执行保存文件线程的join()方法。问题更严重了:当第二次进行保存操作时就出错,Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException。看书上意思是不能调用两次start()方法这样说只能每次保存文件都开一个线程,但是新开线程的话,在执行System.Exit(0);之前需要join()
就不知道如何调用了,因为没法得到新开的线程的引用求大虾们给一个两全其美的解决方案,谢谢了

解决方案 »

  1.   

    1:一个线程只能调用一次start方法,停止了的线程再次调用start方法无效,必须新开一个线程。把所有的线程的引用储存起来,如放在一个List中,在System.Exit之前判断一下是不是所有的线程都已经结束了。这样应该可以。用以上的方法,如果线程过于太多了的话,可能会导致内存不够用,所以如果线程太多了,就要求要用一个控制线程来专门管理这个保存线程的List,判断哪些已经运行结束了,运行结束了就从List中remove掉,这样垃圾回收器就能够回收它了。
      

  2.   

    谢楼上
    再帮忙看下这个例子,其中的思路用到我说的情况当中,是不是可行,线程多了会出毛病吗?
    package dadsa;
    public class ThreadDemo extends Thread{
    private mthread mt;

    public static void main(String[] args) {
    ThreadDemo td = new ThreadDemo();
    td.test();
    }
    private void test(){
    mt = new mthread(Integer.MAX_VALUE/2);
    mt.setName("mt");
    mthread temp = new mthread(Integer.MAX_VALUE/5);
    temp.setName("临时1");
    mt.start();
    temp.start();
    temp.waitother(mt);
    mt = temp;
    temp = new mthread(Integer.MAX_VALUE/50);
    temp.setName("临时2");
    temp.start();
    temp.waitother(mt);
    mt = temp;
    try {
    mt.join();
    System.exit(0);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    //下面的代码未执行
    temp = new mthread(Integer.MAX_VALUE/2);
    temp.setName("临时3");
    temp.start();
    }
    class mthread extends Thread{
    private int max;
    public mthread(int max){
    this.max = max;
    }
    public void run(){
    int s = 0;
    for(int i=0;i<max;i++){
    // if(wait&&waitit.isAlive())
    // try {
    // waitit.join();
    // } catch (InterruptedException e) {
    // e.printStackTrace();
    // }
    s = s + i;
    }
    System.err.println(this.getName()+"执行完了");
    }
    public void waitother(mthread mtd){
    try {
    mtd.join();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }
      

  3.   

    假如我用了好多次
            temp = new mthread(Integer.MAX_VALUE/50);
            temp.setName("临时2");
            temp.start();
            temp.waitother(mt);
            mt = temp;有一个可能:有一个实例未执行完,而temp和mt都没有指向他,那么这个未执行玩的实例会出问题吗