Прервать JUnit поток внешне - PullRequest
1 голос
/ 07 мая 2019

Я пишу тестовое приложение, которое использует JUnit. Мы запускаем JUnit вручную с работающим классом

public class MyLauncher implements Runnable {

    public void run() {
        launchJunit();
    }

    private void launchJunit() {
        LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request().selectors(selectors).build();
        Launcher launcher = LauncherFactory.create();
        launcher.execute(request);
    }
}

с помощью

public class MyApplication {

    public void main(String[] args) {
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
        ScheduledFuture<?> thread = null;
        thread = pool.schedule(new MyLauncher());

        //
        // do some magic
        //

        thread.cancel(true);
        // or
        pool.shutdownNow();
    }
}

Однако ни thread.cancel(), ни pool.shutdownNow() не прервут поток JUnit. Если я не использую System.exit(0) в конце своего приложения, JUnit продолжит работу. Есть ли способ прервать поток JUnit? Я использую расширения JUnit, чтобы при необходимости подключиться к некоторому обратному вызову.

1 Ответ

1 голос
/ 07 мая 2019

Я попробовал это, и мне кажется, что поток прерывается функцией pool.shutdownNow (), но с небольшой задержкой.

Вы можете использовать метод https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#awaitTermination, чтобы дождаться его завершения.

Когда я переставляю твой код следующим образом:

public static void main(String[] args) throws InterruptedException {
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
        ScheduledFuture<?> thread = null;
        MyLauncher myLauncher = new MyLauncher();
        thread = pool.schedule(myLauncher, 0, TimeUnit.MILLISECONDS);

        Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
        System.out.println("Number of threads: " + threadSet.size());


        thread.cancel(true);
        pool.shutdownNow();

        System.out.println("Waiting for thread to terminate...");
        pool.awaitTermination(10, TimeUnit.SECONDS);

        threadSet = Thread.getAllStackTraces().keySet();
        System.out.println("Number of threads: " + threadSet.size());
}

Я получаю вывод:

Количество нитей: 6
Ожидание завершения потока ...
Количество потоков: 5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...