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获取一个未来
,假设您不需要结果。存在过载。