您的位置:首页 > 编程语言 > Java开发

Java基础-jdk自动资源管理功能

2016-02-14 22:19 507 查看
      JDK1.7新功能中,一个很好用的功能就是自动资源管理功能try-with-resources。

      try-with-resources 是一个定义了一个或多个资源的try 声明,这个资源是指程序处理完它之后需要关闭它的对象。try-with-resources 确保每一个资源在处理完成后都会被关闭。 任何实现了java.lang.AutoCloseable 接口和java.io.Closeable 接口的对象,都可以使用try-with-resources。 

      Java中某些资源是需要手动关闭的,如InputStream,Writes,Sockets,ServerSocket,Sql classes等,这些类都是实现了Closeable 或者AutoCloseable 接口的。这个新的语言特性允许try语句本身申请更多的资源,这些资源作用于try代码块,并自动关闭。JDK1.7中还有很多实现了Closeable接口的类,这些都是需要手动关闭的资源。使用try()将对这些资源类型的定义放在try()的括号中,那么在代码运行结束后就会自动被JVM关闭的。

     Socket开发中简单的实例如下:

try (ServerSocket serverSocket = new ServerSocket(8189)) {
Socket socket = serverSocket.accept();
} finally {
System.out.println("the server is closed !");
}

      此外,需要注意的是对资源的关闭,必须在其他线程使用资源完成后再进行,否则就会出现异常。例如Socket开发时,Socket处理操作和关闭操作不是在同一个线程中,那么就会出现Socket关闭异常。一个错误的实例代码如下:

try (Socket socket = new Socket("127.0.0.1", 8189)){
new Thread(new Runnable() // print server's info
{
@Override
public void run() {
try {
Scanner scanner = new Scanner(socket.getInputStream());
while (true) {
if (scanner.hasNext()) {
String line = scanner.nextLine();
System.out.println("from client: " + line);
if (line.equals("bye")) {
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} finally {
System.out.println("the client is closed !");
}       上述实例中main线程中使用自动资源管理自动关闭Socket,然后再另一个线程中开启的发送线程仍然在使用该Socket,此时就会遭遇Socket已关闭异常了。总的来说,这个功能还是很好用的,简化了程序开发,而且还能避免大意造成资源不关闭的问题。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: