Stop the running process through the GUI in Java
I have a GUI program that executes TestNG automation scripts This means that users can easily configure certain settings and start the automation scripts they want
One thing I need to add is the ability to immediately stop the running TestNG process As in eclipse, the terminate button immediately stops anything running
This is the code to start the TestNG test, as follows:
public class ScriptRunner implements Runnable { public void runScript() { Thread testRun = new Thread(this); testRun.start(); } @Override public void run() { //varIoUs other things are configured for this,//but they're not relevant so I left them out TestNG tng = new TestNG(); //While this runs,varIoUs browser windows are open,//and it Could take several minutes for it all to finish tng.run(); } }
According to the comments, TNG Run () may take a few minutes to complete. It is performing several operations, opening / closing browser windows, etc
How can I terminate the process immediately, just like running an application from the IDE?
Edit:
According to the comments, I tried to use serviceexecutor and shutdownnow(). The code looks like this:
ExecutorService executorService = Executors.newFixedThreadPool(10); public void runScript() { executorService.execute(this); } //this method gets called when I click the "stop" button public void stopRun() { executorService.shutdownNow(); } @Override public void run() { //same stuff as from earlier code }
Solution
I've been working on the executive framework recently I have listed my problems here
If you are performing some IO operations, be careful. The program service may not shut down immediately If you see the following code, stopthread is important because it tells your program that it has asked the thread to stop You can stop some iterations of what you are doing I'll modify your code like this:
public class MyClass { private ExecutorService executorService; private boolean stopThread = false; public void start() { // gives name to threads BasicThreadFactory factory = new BasicThreadFactory.Builder() .namingPattern("thread-%d").build(); executorService = Executors.newSingleThreadExecutor(factory); executorService.execute(new Runnable() { @Override public void run() { try { doTask(); } catch (Exception e) { logger.error("indexing Failed",e); } } }); executorService.shutdown(); } private void doTask() { logger.info("start reindexing of my objects"); List<MyObjects> listOfMyObjects = new MyClass().getMyObjects(); for (MyObjects myObject : listOfMyObjects) { if(stopThread){ // this is important to stop further indexing return; } DbObject dbObjects = getDataFromDB(); // do some task } } public void stop() { this.stopThread = true; if(executorService != null){ try { // wait 1 second for closing all threads executorService.awaitTermination(1,TimeUnit.SECONDS); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }
}