【发布时间】:2019-11-17 23:13:37
【问题描述】:
有人可以看看下面这个程序吗?
小进程运行正常,大进程完成后不退出程序。
注意:如果是小查询,大约50条记录(检索和更新),程序正在正常退出......
这个程序的目的是从数据库中获取数据,去云端读取JSON,验证数据并用结果更新数据库中的记录。
public class ThreadLauncher
{
public static void main(String args[])
{
final ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); // or hardcode a number
List<Future<Runnable>> futures = new ArrayList<Future<Runnable>>();
for (int n = 0; n < 10; n++)
{
Future f = service.submit(new Task(n));
futures.add(f);
}
// wait for all tasks to complete before continuing
for (Future<Runnable> f : futures)
{
try {
f.get();
//shut down the executor service so that this thread can exit
} catch (InterruptedException e) {
System.out.println("Exiting with InterruptedException : " + e.getMessage());
e.printStackTrace();
} catch (ExecutionException e) {
System.out.println("Exiting with ExecutionException : " + e.getMessage());
e.printStackTrace();
}
}
service.shutdownNow();
System.out.println("Exiting normally...");
}
}
final class Task
implements Runnable
{
private int loopCounter;
private int totalLoops = 5;
public Task(int counter)
{
this.loopCounter = counter;
}
@Override
public void run()
{
try {
GCPJSON.getInstance().getGCPDataFromJSON(PRODDataAccess.getInstance().getDataToProcess(loopCounter,totalLoops));
System.out.println("Task ID : " + this.loopCounter + " performed by " +
Thread.currentThread().getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
【问题讨论】:
-
您需要进一步了解线程是如何“正常”终止的其中一件事。在Java中,你不能停止一个正在运行的线程,你所能做的就是“中断”线程,并希望任何正在运行的任务都支持中断。
-
JavaDocs for
shutdownNow甚至这么说 - “除了尽力停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过 Thread.interrupt() 取消,因此任何无法响应中断的任务都可能永远不会终止。” -
如前所述,您需要更好地理解 JVM 中的整体“线程”。在您的示例中,
shutdownNow()也不会添加任何值,因为您已经通过调用future.get()阻塞了主线程,即使这些任务没有实现Callable接口,这意味着它们不会返回任何内容。仍然不清楚您要实现什么目标 -
感谢您的反馈。完成该过程后,我需要干净地退出程序。您能否更新代码以添加 Callable ?或者给我举一个很好的例子?
标签: java multithreading executorservice