如何异步删除文件

Sed*_*lat 2 java asynchronous file delete-file

在下面,它使用EJB注入异步删除文件.

@Asynchronous
protected void deleteFileAsync(File file) {
    if (file != null)
        file.delete();
}
Run Code Online (Sandbox Code Playgroud)

是否可以在不使用任何注释和EJB注入的情况下异步删除文件?

Iva*_*nin 6

使用EJB中的文件系统是不好的做法,因为文件系统不是事务性的.

是的,可以异步删除文件:在单独的线程中执行.您可以自己创建单独的线程,如下所示:

public static void deleteFile(final File file) {
    if (file != null) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                file.delete();
            }
        }).start();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如果你将从循环调用这个函数,你将创建许多无法控制的线程,这将浪费你的记忆.你可以使用Executors来避免这种情况.使用此实用程序类,您可以使用单个线程创建线程池,它将为您的所有文件删除任务提供服务:

private static final ExecutorService DELETE_SERVICE = Executors.newSingleThreadExecutor();

public static void deleteFile(final File file) {
    if (file != null) {
        DELETE_SERVICE.submit(new Runnable() {
            @Override
            public void run() {
                file.delete();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

这里你将有一个线程,它将异步删除文件.

  • 在Java EE应用程序服务器中手动生成线程通常不是一个好习惯,因为资源(如线程)应该由应用服务器管理.而不是使用`Executors`,最好使用Java EE版本,注入`@Resource ManagedExecutorService` (2认同)