我在程序中使用了多线程,但是只用run方法,没有关闭,请问这个线程什么时候会关闭,如果时间久了,会导致内存溢出吗?我的代码为:
public void readData() {
// 在新线程中调用耗时操作
new Thread() {
public void run() {
                                  writeLog();
                             }

}.start();
}public void riteLog(){
FileWriter fw =null;
try {
fw=new FileWriter("d:/tt.txt");
    fw.write("test!!!");
 }catch (Exception e) {
MutilLogWriter.write(2, "", " makeRealData error:" + e.getMessage());
}finally{
try {
fw.flush();
fw.close();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }如果想在程序中设置写完日志后将线程关闭,可以通过在run方法中用boolean变量判断吗?如改成:
public void readData() {
// 在新线程中调用耗时操作
new Thread() {
                        boolean bol=true;
public void run() {
                                 while(bol){
                                    bol=writeLog();
                                 }
                             }

}.start();
}public boolean  writeLog(){
boolean bol=true;
FileWriter fw =null;
try {
fw=new FileWriter("d:/tt.txt");
    fw.write("test!!!");
 }catch (Exception e) {
MutilLogWriter.write(2, "", " makeRealData error:" + e.getMessage());
}finally{
try {
fw.flush();
fw.close();
bol=false;
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return bol; }

解决方案 »

  1.   

    单个的线程是无需关闭的,只有线程池才可能需要关闭自己new出来的线程在run方法结束,run抛出异常,jvm退出时会自动销毁
      

  2.   

    不需要关啊,run方法里面没有循环,跑完后线程就会over
      

  3.   

    但是在做性能测试时,20个用户并发,跑几分钟后就会出现outofmemoryError: unadle to create new native thread错,然后我将代码改成下面用boolean类型判断后,就不会出现错误了,请问什么原因?
      

  4.   

    outofmemoryError: unadle to create new native thread
    你的线程new的太多了
      

  5.   

    代码就在最上面,并发一直调用readData方法
      

  6.   

    首先,内存溢出跟线程结束否没有关系,除非你 new了N多个线程。 如果就只有有限的几个线程在运行,内存溢出的一般情况是,线程运行过程中new了一些object,装到容器中(List, Map)等,这样运行下去,就会内存溢出。 (总结就是一句,对象在不断的增加,否则就不会出现溢出)然后,关于啥时候结束的问题,要分是否守护线程(daemon thread),
        daemon thread是守护线程,它在程序的背后提供服务的线程,它自贯穿程序始终,当程序结束了,它也就结束了,如果还有非守护线程的线程在执行,它就不会结束。
      

  7.   

    这是用来写日志的,就是每写一次就new一次线程,如果按你们的说法,线程run方法执行完会自己关闭,那为什么还会报这个错呢?
      

  8.   

    单个线程如果没有死循环在run()执行完之后该线程自动销毁,如果是多线程呢,除了刚才那种可能,还可以调用sleep()或者wait()方法让其暂停。
      

  9.   

    public void readData() {
    //    在新线程中调用耗时操作 
    new Thread() {
    public void run() {
    writeLog();
    } }.start();
    } public void writeLog() {
    FileWriter fw = null;
    try {
    fw = new FileWriter("d:/tt.txt ");
    fw.write("test!!! ");
    }
    catch (Exception e) {
    MutilLogWriter.write(2, " ", "   makeRealData   error: " + e.getMessage());
    }
    finally {
    try {
    fw.flush();
    fw.close();
    }
    catch (IOException e) {
    //    TODO   Auto-generated   catch   block 
    e.printStackTrace();
    }
    } }
      

  10.   

    感谢各位的回答,可是根本问题没有解决啊,我想知道并发时为什么会出现outofmemoryError: unadle to create new native thread错误?
      

  11.   

    内存溢出了,就这段代码好像没看出什么,我想知道你是怎么调用readData()的
      

  12.   

    这是用来写日志的,就是每写一次日志就调一次readData()方法,一个交易下来要写好多次日志
      

  13.   

    一次交易会写多少次日志?
    你可以写个测试代码
    for (int i=0; i<INTEGER.MAX_VALUE; i++) {
        System.out.println(i); //看看多少次调用会发生这种情况,
                                   //然后比较一下一次交易会发生写入的日志次数
        readData();
    }
      

  14.   

    如果一次交易发生的写日志次数太多,可以考虑用线程池,每次new一个,线程过多也会影响性能,交易发生的时候,只需要把日志信息保存到一个队列中,线程池从队列中取出日志保存就可以了,不过按你这么说,这个队列可能量也会很大,也有可能发生内存溢出
      

  15.   

    那楼上的有什么好的方法解决吗?现在我把一些for或while中写日志的地方去掉了,这时写日志的次数少了很多,现在就不会出错了,不是说线程用完会自己关闭吗?那为什么会出现内存溢出呢?
      

  16.   

    因为线程的执行是随机的,不是说你start了就代表马上执行,你new得很快的话,很多现成都还没来得及执行,所以就会越来越多,内存就会越来越大,所以这种情况下用线程池处理比较好。