java 线程中的值如何返回

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 线程中的值如何返回相关的知识,希望对你有一定的参考价值。

java 线程public void run()中值如何返回

如果是java5的话,那么Java5新增了Callable接口获得线程的返回值,用法如下

package com.ronniewang;  
  
  
import java.util.concurrent.Callable;  
import java.util.concurrent.ExecutionException;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
import java.util.concurrent.Future;  
  
  
public class GetReturnValueFromCallable   
  
  
    private static final int SLEEP_MILLS = 3000;  
  
  
    private static final int SECOND_MILLS = 1000;  
  
  
    private static int sleepSeconds = SLEEP_MILLS / SECOND_MILLS;  
  
  
    ExecutorService executorService = Executors.newCachedThreadPool();  
  
  
    /** 
     * 在创建多线程程序的时候,我们常实现Runnable接口,Runnable没有返回值,要想获得返回值,Java5提供了一个新的接口Callable 
     */  
    public static void main(String[] args)   
  
  
        new GetReturnValueFromCallable().testCallable();  
      
  
  
    private void testCallable()   
  
  
        /** 
         * Callable需要实现的是call()方法,而不是run()方法,返回值的类型有Callable的类型参数指定, 
         * Callable只能由ExecutorService.submit() 执行,正常结束后将返回一个future对象 
         */  
        Future<String> future = executorService.submit(new Callable<String>()   
  
  
            public String call() throws Exception   
  
  
                Thread.sleep(SLEEP_MILLS);  
                return "I from callable";  
              
        );  
  
  
        while (true)   
            /** 
             * 获得future对象之前可以使用isDone()方法检测future是否完成,完成后可以调用get()方法获得future的值, 
             * 如果直接调用get()方法,get()方法将阻塞值线程结束 
             */  
            if (future.isDone())   
                try   
                    System.out.println(future.get());  
                    break;  
                 catch (InterruptedException e)   
                    // ignored  
                 catch (ExecutionException e)   
                    // ignored  
                  
              
            else   
                try   
                    System.out.println("after " + sleepSeconds-- + " seconds, we will get future");  
                    Thread.sleep(SECOND_MILLS);  
                 catch (InterruptedException e)   
                    // ignored  
                  
              
          
      
  
package com.ronniewang;


import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;


public class GetReturnValueFromCallable 


    private static final int SLEEP_MILLS = 3000;


    private static final int SECOND_MILLS = 1000;


    private static int sleepSeconds = SLEEP_MILLS / SECOND_MILLS;


    ExecutorService executorService = Executors.newCachedThreadPool();


    /**
     * 在创建多线程程序的时候,我们常实现Runnable接口,Runnable没有返回值,要想获得返回值,Java5提供了一个新的接口Callable
     */
    public static void main(String[] args) 


        new GetReturnValueFromCallable().testCallable();
    


    private void testCallable() 


        /**
         * Callable需要实现的是call()方法,而不是run()方法,返回值的类型有Callable的类型参数指定,
         * Callable只能由ExecutorService.submit() 执行,正常结束后将返回一个future对象
         */
        Future<String> future = executorService.submit(new Callable<String>() 


            public String call() throws Exception 


                Thread.sleep(SLEEP_MILLS);
                return "I from callable";
            
        );


        while (true) 
            /**
             * 获得future对象之前可以使用isDone()方法检测future是否完成,完成后可以调用get()方法获得future的值,
             * 如果直接调用get()方法,get()方法将阻塞值线程结束
             */
            if (future.isDone()) 
                try 
                    System.out.println(future.get());
                    break;
                 catch (InterruptedException e) 
                    // ignored
                 catch (ExecutionException e) 
                    // ignored
                
            
            else 
                try 
                    System.out.println("after " + sleepSeconds-- + " seconds, we will get future");
                    Thread.sleep(SECOND_MILLS);
                 catch (InterruptedException e) 
                    // ignored
                
            
        
    


输出结果:
after 3 seconds, we will get future
 after 2 seconds, we will get future
 after 1 seconds, we will get future
 I from callable
参考技术A 先如一楼所示那样把值改变了,
然后在 run 方法方法中触发一些事件(如启动一个 Timer),再在让事件监听器函数返回那些被操作大的值
参考技术B public class A implements java.lang.Runnable
private Object obj;
//obj将是你要从run()方法返回的参数
public void run()
//操作obj

本回答被提问者采纳
参考技术C 在run()后面写一些get的方法阿。
前面申明一些函数。

以上是关于java 线程中的值如何返回的主要内容,如果未能解决你的问题,请参考以下文章

android AsyncTask 怎么返回值给UI线程

android AsyncTask 怎么返回值给UI线程

如何在不使用 C++/C 中的阻塞函数的情况下将值从线程返回到主函数

java 子线程如何返回结果给主线程

python的线程如何返回值?

在Java 线程中返回值的用法