如何在线程完成执行后退出应用程序

时间:2018-03-19 11:29:03

标签: java multithreading

我有以下代码

    public static void main(String[] args) {
    new Thread() { 
        public void run() {
            try {
                employee1();
            } catch (Exception e) {
                Logger.LogServer(e);
            }
            finally {
                Logger.LogServer("empployee1 records inserted");
          }
        }
    }.start();
    new Thread() { 
        public void run() {
            try {
                employee2();
            } catch (Exception e) {
                Logger.LogServer(e);
            }
            finally {
                Logger.LogServer("employee2 records inserted");
          }
        }
    }.start();
}

我想等待两个步骤完成执行,然后使用System.exit(0);退出应用程序。我怎样才能做到这一点?

有人可以帮助我。

5 个答案:

答案 0 :(得分:4)

您需要在两个线程上使用join()

根据official documentation

  

join 方法允许一个线程等待另一个线程的完成。如果t是其线程当前正在执行的Thread对象,   t.join()导致当前线程暂停执行,直到线程终止。

public static void main(String[] args) {
    Thread t1 = new Thread() { 
        public void run() {
            ...
        }
    };
    Thread t2 = new Thread() { 
        public void run() {
            ...
        }
    };

    t1.start();
    t2.start();

    t1.join();
    t2.join();   
}

答案 1 :(得分:1)

Thread t1 = ...
Thread t2 = ...
t1.join();
t2.join();
System.exit(0);

您需要捕获InterruptedException或将main标记为抛出它。

答案 2 :(得分:0)

您可以使用.join()来阻止线程执行完毕。

Thread t = new Thread() { 
    public void run() {
        try {
            employee1();
        } catch (Exception e) {
            Logger.LogServer(e);
        }
        finally {
            Logger.LogServer("empployee1 records inserted");
      }
    }
}.start();
Thread t2 = new Thread() { 
    public void run() {
        try {
            employee2();
        } catch (Exception e) {
            Logger.LogServer(e);
        }
        finally {
            Logger.LogServer("employee2 records inserted");
      }
    }
}.start();
t.join();t2.join();
System.exit(0);

答案 3 :(得分:0)

如果要终止流使用System.exit(0)

您可以简单地在某处保留对所有线程的引用(如列表),然后再使用引用。

List<Thread> appThreads = new ArrayList<Thread>();

每次你开始一个帖子:

Thread thread = new Thread(new MyRunnable()); appThreads.add(螺纹); 然后当你想要终止信号时(不是通过停止我希望:D)你可以轻松访问你创建的线程。

您也可以使用ExecutorService并在不再需要时调用shutdown:

ExecutorService exec = Executors.newFixedThreadPool(10);
...
exec.submit(new MyRunnable());
...
exec.shutdown();

这是更好的,因为你不应该为你想要执行的每个任务创建一个新线程,除非它长时间运行I / O或类似的东西。

答案 4 :(得分:0)

请注意,您不应直接创建线程。使用ExecutorService启动异步任务:

ExecutorService executor = Executors.newFixedThreadPoolExecutor(4);
executor.submit(() -> employee1());
executor.submit(() -> employee2());
executor.shutdown();
executor.awaitTermination(timeout, TimeUnit.MILLISECONDS);
// all tasks are finished now