Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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_Jvm - Fatal编程技术网

Java 运行完成后调用线程对象方法

Java 运行完成后调用线程对象方法,java,multithreading,jvm,Java,Multithreading,Jvm,我正在编写一个类,它在一个单独的线程上读取远程文件数据 这个类从线程继承并在run方法中读取一些远程文件数据 我可以添加其他返回此数据字符串的方法吗 在run方法返回后,我看到isalive返回假值 我需要使用事件机制吗 请建议一些更好的解决方法。对于您的情况,我会使用a,例如 Callable<String> callable = new Callable<String>() { @Override public String call() throw

我正在编写一个类,它在一个单独的线程上读取远程文件数据

这个类从线程继承并在run方法中读取一些远程文件数据

我可以添加其他返回此数据字符串的方法吗

在run方法返回后,我看到isalive返回假值

我需要使用事件机制吗

请建议一些更好的解决方法。

对于您的情况,我会使用a,例如

Callable<String> callable = new Callable<String>() {

    @Override
    public String call() throws Exception {
        // do your work here and return the result
        return "Hello";
    }
};
Way#1

改为使用,并从中获取此字符串

在此处检查返回字符串的

像这样:

public class GetDataCallable implements Callable<String> {  
    @Override
    public String call() throws Exception {
        return getDataFromRemote(); //get from file and returns
    }

}
但是,在调用getData()之前,必须确保线程已完成,例如,可以使用thread.join()来完成此操作

thread.start()
..//some jobs else
thread.join();
String data=thread.getData();
Way#3

run()结束时使用一些静态回调方法


线程
继承是一种不好的做法。将您的代码放入一个
Runnable
。Jaskey,谢谢。当run方法完成时,thread对象的isalive为false。即使isalive为false,我也可以调用getData方法吗?@ramu,我没有尝试过,请检查这里
public class GetDataCallable implements Callable<String> {  
    @Override
    public String call() throws Exception {
        return getDataFromRemote(); //get from file and returns
    }

}
    GetDataCallable <String> task = new GetDataCallable <String>();
    ExecutorService service = Executors.newFixedThreadPool(1);
    Future<String> future =service.submit(task);//run the task in another thread,
    ..//do any thing you need while the thread is runing 
    String data=future.get();//Block and  get the returning string from your Callable task
public youThread extends Thread{
     private String data;//this is what you need to return

     @Override
     public void run(){
         this.data=//get from remote file.
     }

     public String getData(){
          return data;
     }
}
thread.start()
..//some jobs else
thread.join();
String data=thread.getData();
  public Class StoreDataCallback{
    public static void storeData(String data_from_thread){
          objectCan.setData(data_from_thread);//get access to your data variable and assign the value 
    }
}

public Class YourThread extends Thread{

     @Override
     public void run(){
       String data =getDataFromRemote();//do some thing and get the data.
       StoreDataCallback.storeData(data);
    }

}