Как мы узнаем, что поток завершил свое выполнение? - PullRequest
1 голос
/ 24 января 2020

Я использую ExecutorService. Ниже приведен код

public class A{ 
   public static void main(String args[]){
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        Runnable worker = new FileUploadThread("thread");
        executorService.execute(worker);
   } 
}

public class FileuploadThread extends Thread{
    //has a parametrized constuctor

     @Override
     public void run(){
        for(int i=0; i<10000; i++){
            syso("executing...");
        }
     }
}

Я хочу получить событие или что-то в методе main, когда поток завершит свою задачу. Как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 24 января 2020

Чтобы узнать о состоянии задачи - Вам нужен экземпляр Future. Теперь есть две точки:

  1. Если вам просто интересно узнать, была ли задача выполнена или нет, используйте executorService.submit(worker) вместо executorService.execute(worker) метода.
  2. Если вы также хотите получить какой-либо результат после завершения задачи, используйте интерфейс Callable вместо Runnable. См. Ниже код:

    public class A {
      public static void main(String args[]){
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        Callable<String> worker = new FileUploadThread("thread");
        Future<String> workerTask = executorService.submit(worker);
    
        try {
            boolean isDone = workerTask.isDone();
            System.out.println("Task is done: " + isDone);
    
            //Wait untill task is executing
            String status = workerTask.get();
    
            System.out.println("Status: " + status);
            isDone = workerTask.isDone();
            System.out.println("Task is done: " + isDone);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        executorService.shutdown();
      }
    }
    
    class FileUploadThread implements Callable<String> {
      //has a parametrized constuctor
      public FileUploadThread(String thread) { }
    
      @Override
      public String call() throws Exception {
        for(int i=0; i<5; i++){
            System.out.println("executing..sleep for 1 sec...");
            Thread.sleep(1000);
        }
        return "DONE";
      }
    }
    

Выход:

Task is done: false
executing..sleep for 1 sec...
executing..sleep for 1 sec...
executing..sleep for 1 sec...
executing..sleep for 1 sec...
executing..sleep for 1 sec...
Status: DONE
Task is done: true
0 голосов
/ 24 января 2020

Вы можете использовать yourThread.join().

0 голосов
/ 24 января 2020

Когда вы start поток с yourThread.start () , система запускает новый поток, делая то, что находится внутри метода run. Вы можете просто напечатать что-то вроде этого: System.out.println("FINISHED " + this.getName()) в конце метода run.

PS : пожалуйста, убедитесь, что вы не размещаете отпечаток выше в некоторых циклах, это должен быть последний оператор в методе run. (Метод .execute () - это почти то же самое с .start ())

...