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

      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已关闭异常了。总的来说,这个功能还是很好用的,简化了程序开发,而且还能避免大意造成资源不关闭的问题。
 

你可能感兴趣的:(Java基础-jdk自动资源管理功能)