Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我们如何知道线程已经完成了它的执行?_Java_Multithreading_Java 7 - Fatal编程技术网

Java 我们如何知道线程已经完成了它的执行?

Java 我们如何知道线程已经完成了它的执行?,java,multithreading,java-7,Java,Multithreading,Java 7,我正在使用这项服务。下面是代码 public class A{ public static void main(String args[]){ ExecutorService executorService = Executors.newFixedThreadPool(5); Runnable worker = new FileUploadThread("thread"); executorService.execute(worker);

我正在使用这项服务。下面是代码

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...");
        }
     }
}
公共A类{
公共静态void main(字符串参数[]){
ExecutorService ExecutorService=Executors.newFixedThreadPool(5);
Runnable worker=new FileUploadThread(“线程”);
executorService.execute(工人);
} 
}
公共类FileuploadThread扩展线程{
//有一个参数化的构造函数
@凌驾
公开募捐{

对于(int i=0;i当您使用yourThread.start()启动
线程时,系统将启动一个新线程,执行
run
方法中的操作。您只需在
run
方法末尾打印如下内容:
system.out.println(“完成”+this.getName())


PS:请确保不要将上面的打印放在某些循环中,它应该是
run
方法中的最后一条语句。(当
使用yourThread.start()启动线程时,.execute()方法几乎与.start()相同)

,系统启动一个新线程,执行
运行
方法中的操作。您只需在
运行
方法末尾打印如下内容:
系统.out.println(“完成”+this.getName())


PS:请确保不要将上面的打印放在某些循环中,它应该是
run
方法中的最后一条语句。(execute()方法与.start()几乎相同)

您可以使用
yourThread.join()
您可以使用
yourThread.join()

要了解任务状态,您需要将来的实例。 现在有两点:

  • 如果您只是想知道任务是否已完成,请使用
    executorService.submit(worker)
    ,而不是
    executorService.execute(worker)
    方法
  • 如果您还希望在任务完成后返回一些结果,请使用
    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";
      }
    }
    

    要了解任务状态,您需要将来的实例。 现在有两点:

  • 如果您只是想知道任务是否已完成,请使用
    executorService.submit(worker)
    ,而不是
    executorService.execute(worker)
    方法
  • 如果您还希望在任务完成后返回一些结果,请使用
    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";
      }
    }
    

    使用
    Callable
    并返回一个值。然后可以使用
    Future#get
    。您能告诉我如何使用吗?或者指出我可以参考的链接吗?声明应该是
    FileuploadThread implements Runnable
    而不是
    FileuploadThread extensed Thread
    。分配
    线程的资源是错误的当您实际上只需要一个
    Runnable
    (Java设计人员让
    Thread
    实现
    Runnable
    导致了这样的错误)时使用
    Callable
    并返回一个值。然后可以使用
    Future#get
    。您能告诉我如何使用吗?或者指出一个我可以参考的链接吗?声明应该是
    FileuploadThread implements Runnable
    而不是
    FileuploadThread extensed Thread
    。分配
    线程的资源是错误的当您实际上只需要一个
    Runnable
    (Java设计人员让
    Thread
    实现
    Runnable
    会导致这样的错误,这是一个很大的错误);此方法实际上是否等待线程执行?如果线程中出现异常,将如何处理它?是的。它会。javadoc中对此进行了解释。这里也解释了异常。对于那些需要链接来处理的人exceptions@Pri_stack需要注意的是,您不必切换到
    Callable
    ,以便o获取一个
    未来
    ,假设您不需要结果。这里有重载语句workerTask.get();此方法实际上是否等待线程执行?如果线程中出现异常,将如何处理它?是的。它会。javadoc中对此进行了解释。这里也解释了异常。对于那些需要链接来处理的人exceptions@Pri_stack需要注意的是,您不必切换到
    Callable
    ,以便o获取一个
    未来
    ,假设您不需要结果。存在过载。