Как завершить обработку других потоков, когда один поток завершает в java - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть несколько тем, которые выполняют поиск. Мне бы хотелось, чтобы, когда один поток завершил поиск и нашел решение, все остальные потоки перестали работать. Это то, что у меня есть до сих пор

import java.util.Scanner;


class NewThread extends Thread  
{ 

    int n = 4;

    NewThread(String threadname, ThreadGroup tgob, int n) 
    { 
        super(tgob, threadname);
        this.n = n;
        start(); 
    } 
public void run() 
    { 

        System.out.println("Thread running");

                   long timestamp1 = System.currentTimeMillis();

                   System.out.println("Solution to "+ n +" queens using hill climbing search:");

                   HillClimbingSearch hcs = new HillClimbingSearch(n);

                   hcs.runSearch();

                   if (hcs.getFinalSolution() != null)
                   hcs.printState(hcs.getFinalSolution());

                   //Printing the solution          
                   long timestamp2 = System.currentTimeMillis();
                   long timeDiff = timestamp2 - timestamp1;
                   System.out.println("Execution Time: "+timeDiff+" ms");

                   System.out.println(Thread.currentThread().getName() + 
                   " finished executing"); 
    } 
}  

public class Main extends Thread{

    public static void main(String[] args) {


            int n = 0; 
            try (Scanner s=new Scanner(System.in)) {
                while (true){
                    System.out.println("Enter the number of Queens :");
                    n = s.nextInt();
                    if ( n == 2 || n ==3) {
                        System.out.println("No Solution possible for "+ n +" Queens. Please enter another number");
                    }
                    else
                        break;
                }
            }

            // creating the thread group 
            ThreadGroup gfg = new ThreadGroup("parent thread group"); 

            NewThread t1 = new NewThread("one", gfg, n); 
            System.out.println("Starting one"); 
            NewThread t2 = new NewThread("two", gfg, n); 
            System.out.println("Starting two"); 
            NewThread t3 = new NewThread("three", gfg, n); 
            System.out.println("Starting three"); 

            boolean keepRunning = true;

            while(keepRunning){
                if (t1.isAlive() && t2.isAlive() && t3.isAlive()){
                    continue;
                } else {
                    t1.interrupt();
                    t2.interrupt();
                    t3.interrupt();
                    keepRunning = false;
                }
            }

            // checking the number of active thread 
            System.out.println("number of active thread: "
                               + gfg.activeCount()); 

        }
}

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

Мой вывод выглядит примерно так

Enter the number of Queens :
5
Starting one
Thread running
Starting two
Starting three
Thread running
Thread running
Solution to 5 queens using hill climbing search:
Solution to 5 queens using hill climbing search:
Solution to 5 queens using hill climbing search:


0 1 0 0 0 
0 0 0 1 0 
1 0 0 0 0 
0 0 1 0 0 
0 0 0 0 1 
0 1 0 0 0 
0 0 0 1 0 
1 0 0 0 0 
0 0 1 0 0 
0 0 0 0 1 
0 1 0 0 0 
0 0 0 1 0 
1 0 0 0 0 
0 0 1 0 0 
0 0 0 0 1 
Execution Time: 81 ms
Execution Time: 72 ms
Execution Time: 98 ms
one finished executing
two finished executing
three finished executing
number of active thread: 0

Спасибо за любую помощь или предложения.

1 Ответ

0 голосов
/ 05 апреля 2020

Вот совет для вас.

Во-первых, вам понадобится метод, который будет go проходить через набор потоков и давать сигнал каждому из них остановиться. Чтобы сделать это, вам нужно сделать коллекцию потоков gfg переменной экземпляра, а не переменной, локальной для основного метода.

Метод, который вы пишете для закрытия потоков, должен перебирать каждый NewThread в gfg. и установите в нем логическое значение как сигнал о том, что пора выходить.

Метод runThis класса NewThread должен периодически проверять этот логический параметр. Как часто это зависит от вас. Если run () обнаруживает, что логическое значение установлено, то завершите работу через тихую ветвь.

Последнее, когда NewThread завершает задачу, он должен вызвать ваш метод для закрытия потоков.

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