在 java 中执行多个线程,每个线程执行一定时间
Execute multiple threads each one for a certain amount of time in java
我正在将文件发送到创建文件的本地服务器。当用户一个接一个地执行多个操作时,我的问题就出现了,如果其中一个请求在 5 分钟内没有得到反馈文件,我需要显示一条错误消息。
我该如何处理所有这些请求?我使用 newSingleThreadScheduledExecutor
来检查反馈文件是否每分钟都存在,但我不知道如何处理多个反馈文件并为 5 分钟的情况保持每个请求的倒计时。
我的尝试:
ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(listPrinter.size()));
for(int i=0;i<list.size();i++){
try {
final File retrievedFile = new File("/home/"+list.get(i)+".csv");
ListenableFuture<File> future = executor.submit(new Callable<File>() {
public File call() {
// Actually send the file to your local server
// and retrieve a file back
if(retrievedFile.exists())
{
new Notification("file exits").show(Page.getCurrent());
}
else{
new Notification("file no exits").show(Page.getCurrent());
}
return retrievedFile;
}
});
future.get(5, TimeUnit.MINUTES);
} catch (InterruptedException ex) {
Exceptions.printStackTrace(ex);
} catch (ExecutionException ex) {
Exceptions.printStackTrace(ex);
} catch (TimeoutException ex) {
Exceptions.printStackTrace(ex);
new Notification("Time out").show(Page.getCurrent());
}
}
但它只是在开始时执行,仅此而已,但是当添加文件时什么也没有发生。
是否可以用 watchService
做到这一点?它对我来说效果很好,但我不知道 5 分钟的情况
看看 Future 界面:
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html
应该完全符合您的问题。
当你运行一个线程时,结果可能是一个 Future,它是一个异步任务的结果,你可以为你正在启动的每个异步任务一个 Future。
Future<File> sendReceiveFile(File inputFile) {
final Future<File> future = new YourFuture<File>(...);
new Thread() {
@Override
public void run() {
File outputFile = null;
try {
outputFile = SendFileToServer(inputFile);
} catch (final Exception e) {
// do something
} finally {
future.setValue(fileOutput);
}
}
}.start();
return future;
}
在你的主要部分:
Future<File> future = sendReceiveFile(myFile);
File outputFile = null;
try {
outputFile = future.get(1, TimeUnit.MINUTE);
} catch(TimeOutException e) {
// do something
}
您可以手动执行此操作,但使用 Guava ListenableFuture 会好得多:
// Here we create a fixed thread pool with 10 threads and an inifinite-capacity queue
ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
final File fileToSend = ...; //
ListenableFuture<File> future = executor.submit(new Callable<File>() {
public File call() {
// Actually send the file to your local server
// and retrieve a file back
File retrievedFile = YourLocalServer.sendAndRetrieve(fileToSend);
return retrievedFile;
}
});
Futures.addCallback(future, new FutureCallback<File>() {
public void onSuccess(File retrievedFile) {
// Handle the successfully retrieved file when it returns
}
public void onFailure(Throwable thrown) {
// Handle the error
}
});
通过异步发送文件,您可以在任何给定时间发送和检索多个文件。然后,当服务器响应(无论是检索到的文件还是错误)时,您可以在响应(检索到的文件或异常)返回时处理它,而无需等待它。这意味着当本地服务器有可用响应时,onSuccess()
或 onFailure()
方法将自动执行。
我解决了这个问题,方法是使用每 5
分钟执行一次的 Timer
来获取最近 5 分钟内发生的所有 db
事务,但没有得到任何响应并显示我的错误代码。它工作得很好。感谢大家的帮助
我正在将文件发送到创建文件的本地服务器。当用户一个接一个地执行多个操作时,我的问题就出现了,如果其中一个请求在 5 分钟内没有得到反馈文件,我需要显示一条错误消息。
我该如何处理所有这些请求?我使用 newSingleThreadScheduledExecutor
来检查反馈文件是否每分钟都存在,但我不知道如何处理多个反馈文件并为 5 分钟的情况保持每个请求的倒计时。
我的尝试:
ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(listPrinter.size()));
for(int i=0;i<list.size();i++){
try {
final File retrievedFile = new File("/home/"+list.get(i)+".csv");
ListenableFuture<File> future = executor.submit(new Callable<File>() {
public File call() {
// Actually send the file to your local server
// and retrieve a file back
if(retrievedFile.exists())
{
new Notification("file exits").show(Page.getCurrent());
}
else{
new Notification("file no exits").show(Page.getCurrent());
}
return retrievedFile;
}
});
future.get(5, TimeUnit.MINUTES);
} catch (InterruptedException ex) {
Exceptions.printStackTrace(ex);
} catch (ExecutionException ex) {
Exceptions.printStackTrace(ex);
} catch (TimeoutException ex) {
Exceptions.printStackTrace(ex);
new Notification("Time out").show(Page.getCurrent());
}
}
但它只是在开始时执行,仅此而已,但是当添加文件时什么也没有发生。
是否可以用 watchService
做到这一点?它对我来说效果很好,但我不知道 5 分钟的情况
看看 Future 界面:
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html
应该完全符合您的问题。
当你运行一个线程时,结果可能是一个 Future,它是一个异步任务的结果,你可以为你正在启动的每个异步任务一个 Future。
Future<File> sendReceiveFile(File inputFile) {
final Future<File> future = new YourFuture<File>(...);
new Thread() {
@Override
public void run() {
File outputFile = null;
try {
outputFile = SendFileToServer(inputFile);
} catch (final Exception e) {
// do something
} finally {
future.setValue(fileOutput);
}
}
}.start();
return future;
}
在你的主要部分:
Future<File> future = sendReceiveFile(myFile);
File outputFile = null;
try {
outputFile = future.get(1, TimeUnit.MINUTE);
} catch(TimeOutException e) {
// do something
}
您可以手动执行此操作,但使用 Guava ListenableFuture 会好得多:
// Here we create a fixed thread pool with 10 threads and an inifinite-capacity queue
ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
final File fileToSend = ...; //
ListenableFuture<File> future = executor.submit(new Callable<File>() {
public File call() {
// Actually send the file to your local server
// and retrieve a file back
File retrievedFile = YourLocalServer.sendAndRetrieve(fileToSend);
return retrievedFile;
}
});
Futures.addCallback(future, new FutureCallback<File>() {
public void onSuccess(File retrievedFile) {
// Handle the successfully retrieved file when it returns
}
public void onFailure(Throwable thrown) {
// Handle the error
}
});
通过异步发送文件,您可以在任何给定时间发送和检索多个文件。然后,当服务器响应(无论是检索到的文件还是错误)时,您可以在响应(检索到的文件或异常)返回时处理它,而无需等待它。这意味着当本地服务器有可用响应时,onSuccess()
或 onFailure()
方法将自动执行。
我解决了这个问题,方法是使用每 5
分钟执行一次的 Timer
来获取最近 5 分钟内发生的所有 db
事务,但没有得到任何响应并显示我的错误代码。它工作得很好。感谢大家的帮助