线程的问题

singlion 2009-07-23 12:01:07
一个线程是不是只能调用一次start()方法?
我写了个记事本,保存较大文件时会卡住,所以我让写文件的类继承了Thread
在其run()方法里边执行写操作,每次保存文件都设置一下文件名和内容后执行start()方法。
这就牵扯出一个新问题,如果还没保存完程序被关闭了,就会丢失需要保存的部分内容。
所以我在System.Exit(0);之前执行保存文件线程的join()方法。

问题更严重了:当第二次进行保存操作时就出错,Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException。看书上意思是不能调用两次start()方法

这样说只能每次保存文件都开一个线程,但是新开线程的话,在执行System.Exit(0);之前需要join()
就不知道如何调用了,因为没法得到新开的线程的引用

求大虾们给一个两全其美的解决方案,谢谢了
...全文
110 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
singlion 2009-07-24
  • 打赏
  • 举报
回复
为了100%结贴率,结贴……
singlion 2009-07-23
  • 打赏
  • 举报
回复
假如我用了好多次
        temp = new mthread(Integer.MAX_VALUE/50);
temp.setName("临时2");
temp.start();
temp.waitother(mt);
mt = temp;

有一个可能:有一个实例未执行完,而temp和mt都没有指向他,那么这个未执行玩的实例会出问题吗
singlion 2009-07-23
  • 打赏
  • 举报
回复
谢楼上
再帮忙看下这个例子,其中的思路用到我说的情况当中,是不是可行,线程多了会出毛病吗?
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();
}
}
}
}
rumlee 2009-07-23
  • 打赏
  • 举报
回复
1:一个线程只能调用一次start方法,停止了的线程再次调用start方法无效,必须新开一个线程。

把所有的线程的引用储存起来,如放在一个List中,在System.Exit之前判断一下是不是所有的线程都已经结束了。这样应该可以。

用以上的方法,如果线程过于太多了的话,可能会导致内存不够用,所以如果线程太多了,就要求要用一个控制线程来专门管理这个保存线程的List,判断哪些已经运行结束了,运行结束了就从List中remove掉,这样垃圾回收器就能够回收它了。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧