一个线程是不是只能调用一次start()方法?
我写了个记事本,保存较大文件时会卡住,所以我让写文件的类继承了Thread
在其run()方法里边执行写操作,每次保存文件都设置一下文件名和内容后执行start()方法。
这就牵扯出一个新问题,如果还没保存完程序被关闭了,就会丢失需要保存的部分内容。
所以我在System.Exit(0);之前执行保存文件线程的join()方法。问题更严重了:当第二次进行保存操作时就出错,Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException。看书上意思是不能调用两次start()方法这样说只能每次保存文件都开一个线程,但是新开线程的话,在执行System.Exit(0);之前需要join()
就不知道如何调用了,因为没法得到新开的线程的引用求大虾们给一个两全其美的解决方案,谢谢了
我写了个记事本,保存较大文件时会卡住,所以我让写文件的类继承了Thread
在其run()方法里边执行写操作,每次保存文件都设置一下文件名和内容后执行start()方法。
这就牵扯出一个新问题,如果还没保存完程序被关闭了,就会丢失需要保存的部分内容。
所以我在System.Exit(0);之前执行保存文件线程的join()方法。问题更严重了:当第二次进行保存操作时就出错,Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException。看书上意思是不能调用两次start()方法这样说只能每次保存文件都开一个线程,但是新开线程的话,在执行System.Exit(0);之前需要join()
就不知道如何调用了,因为没法得到新开的线程的引用求大虾们给一个两全其美的解决方案,谢谢了
再帮忙看下这个例子,其中的思路用到我说的情况当中,是不是可行,线程多了会出毛病吗?
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();
}
}
}
}
temp = new mthread(Integer.MAX_VALUE/50);
temp.setName("临时2");
temp.start();
temp.waitother(mt);
mt = temp;有一个可能:有一个实例未执行完,而temp和mt都没有指向他,那么这个未执行玩的实例会出问题吗