Должны ли потоки быть закрыты после каждого использования? - PullRequest
4 голосов
/ 25 марта 2019

Я сейчас работаю на сервере UDP для игры. На этом сервере используйте ByteArrayInputStream и ObjectInputStream каждый тик для преобразования сериализованных байтов в объекты. Разве эффективнее создать одну переменную для потоков и закрыть их один раз при закрытии программы?

вроде так:

class Main {
private static ByteArrayInputStream byteIn;
private static ObjectInputStream objectIn;

public static void main(String[] args) {
    while(true){
      receive();
    }
    //when program is done call close();
}

 public static void receive(){
     byteIn = new ByteArrayInputStream();
     objectIn = new ObjectInputStream(new BufferedInputStream(byteIn));
      //do something
  }

 public static void close(){
    objectIn.close();
    byteIn.close();
  }
}

Или более эффективно создавать и закрывать новые потоки каждый раз?

вроде так:

class Main {

public static void main(String[] args) {
    while(true){
      receive();
    }
}

 public static void receive(){
    ByteArrayInputStream byteIn = new ByteArrayInputStream();
    ObjectInputStream objectIn = new ObjectInputStream(new BufferedInputStream(byteIn));
    //do something
    objectIn.close();
    byteIn.close();
  }
}

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

Да, вам нужно закрыть потоки.Используйте блок try-with-resources .Он закроет вам поток.

2 голосов
/ 25 марта 2019

Если вы открываете поток, вы должны закрыть его. Код в вопросе не делает этого, он просто покидает предыдущие потоки и закрывает только самые последние, которые он создает.

Непонятно, почему эти переменные потока должны быть static, а не локальными в receive. Если бы они были локальными в receive, вы могли бы использовать try-with-resources для их автоматической очистки:

public static void receive(){
    try (
        ByteArrayInputStream byteIn = new ByteArrayInputStream();
        ObjectInputStream objectIn = new ObjectInputStream(new BufferedInputStream(byteIn));
    ) {
        //do something
    }
}

Они будут автоматически закрыты, когда управление выйдет из try.

Если по какой-то причине у них есть , чтобы быть членами класса static, просто закройте и отпустите каждый созданный вами элемент (но гораздо проще иметь ошибки в коде, что означает, что у него есть пути выполнения, которые не в состоянии сделать это).

// All done
objectIn.close();
objectIn = null;
byteIn.close();
byteIn = null;

Примечание: с этими тремя типами потоков вам может не потребоваться byteIn в качестве отдельной переменной. Подробнее в ответах на этот вопрос .

...