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开发中简单的实例如下:
此外,需要注意的是对资源的关闭,必须在其他线程使用资源完成后再进行,否则就会出现异常。例如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已关闭异常了。总的来说,这个功能还是很好用的,简化了程序开发,而且还能避免大意造成资源不关闭的问题。
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多线程
- 从头认识Spring-2.3 注解装配-@autowired(5)-限定器@Qualifier(2)
- java并行编程
- JAVA与C#的区别
- 从头认识Spring-2.3 注解装配-@autowired(5)-限定器@Qualifier(1)
- 线程基础:JDK1.5+(9)——线程新特性(中)
- 有关eclipse for java ee版本遇到的坑( Context initialization failed)
- eclipse中离线安装genymotion插件
- Spring+Quartz(定时任务)
- JVM如何判断对象是否需要被回收
- 一个简单的springmvc-mybatis项目,新闻网站
- eclipse卸载自带maven
- eclipse卸载自带maven
- 【JAVA】9、表达式类型的转换
- java定时删除文件夹及文件
- 从头认识Spring-2.3 注解装配-@autowired(4)-required(2)
- spring的ioc简述
- 【JAVA】8、简洁表达式
- 初窥JAVA底层————System.out.println("Hello World");
- Spring核心组件