「java多线程返回结果」java有返回值的线程

博主:adminadmin 2022-11-25 07:02:06 40

本篇文章给大家谈谈java多线程返回结果,以及java有返回值的线程对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java 线程中的值如何返回

如果是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对象 

         */  

        FutureString future = executorService.submit(new CallableString() {  

  

  

            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对象

         */

        FutureString future = executorService.submit(new CallableString() {

            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

java多线程编程代码如下,输出结果如下:

首先,你同步的是具体的某个Test实例, 对于那个实例来说,实际上只有一个线程访问了那个代码块,但是sum和other却是多个线程同时去进行访问,实际上这是不安全的,如果你想实现每次都输出10000的效果,那么正确的应该是在Test.class上加锁,而不是获取Test实例的锁,修改后的代码如下:

public class Test extends Thread {

    public static int sum = 10000;

    public static int other = 0;

    public void getMoney() {

        synchronized (Test.class) {

            System.out.println(Thread.currentThread().getName() + " 开始执行");

            sum = sum - 100;

            System.out.println("sum-100");

            other = other + 100;

            System.out.println("other+100");

            System.out.println(sum + other);

            System.out.println(Thread.currentThread().getName() + " 执行完成");

        }

    }

    public void run() {

        getMoney();

    }

    public static void main(String[] agrs) {

        Thread t[] = new Thread[10];

        for (int i = 0; i = 9; i++) {

            t[i] = new Test();

            t[i].start();

        }

    }

}

// 上面代码能得到你的结果

如何在java中获取线程异步执行之后的结果

java中提供了FutureV接口和实现了Future接口的FutureTaskV 类来将线程执行之后的结果返回(通过get()方法)。

1.FutureV接口

Runnable接口执行任务是不返回任何值的,Runnable的run()方法的执行结果是void,而Future接口的call方法是有返回结果的,这是Runnable跟Future的区别之一,它们的另一个不同之处就是实现了Runnable接口的任务执行是调用ExecutorService的execute(Runnable task)方法,而实现了Future接口的任务是调用ExecutorService的submit(Future task)方法。调用Future的get()方法就能直接得到任务的返回值,该方法会一直阻塞直到任务的结果出来为止,我们可以调用Future的isDone()方法来判断该任务的结果是否准备就绪。

[java] view plain copy

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 TestFuture {

public static void main(String[] args) throws InterruptedException, ExecutionException {

ExecutorService executor = Executors.newCachedThreadPool();

Future result1 = executor.submit(new Callable() {

@Override

public Integer call() throws Exception {

int sum = 0;

for (int i = 0; i 10; i++) {

sum += i;

}

return sum;

}

});

Future result2 = executor.submit(new Callable() {

@Override

public Integer call() throws Exception {

int sum = 0;

for (int i = 10; i 100; i++) {

sum += i;

}

return sum;

}

});

executor.shutdown();

System.out.println(result1.get() + result2.get());

}

}

2.FutureTask类

FutureTask实现了Future接口,将一个Callable实例作为参数传给它,就能创建一个FutureTask实例,然后用ExecutorService的submit方法来执行这个实例。最后同样是用get方法获取线程执行后的结果。

[plain] view plain copy

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.FutureTask;

public class TestFutureTask {

public static void main(String[] args) throws InterruptedException, ExecutionException {

ExecutorService executor = Executors.newCachedThreadPool();

Callable task = new Callable() {

@Override

public String call() throws Exception {

return "结果";

}

};

FutureTask ft = new FutureTask(task);

executor.submit(ft);

System.out.println(ft.get());

executor.shutdown();

}

}empty

Java两个线程分别返回两个ResultSet,如何分多次读取两个ResultSet的结果?

创建实体

ResultBean

private RsultSet resultSet;

private ListBean resultList;

包含方法:

方法1:public ListBean getResultList();每次将resultList清空后使用resultSet.next读取Bean再添加,判断是否遍历完毕,遍历完毕调用closeResultSet方法并返回null

方法2:public void closeResultSet();关闭ResultSet

2.建立一个单例工具类ResultUtil,包含以下私有成员

private Map用户操作标识,ResultBean resultMap;

用户操作标识每次进入页面时随机生成一个且不可重复,后续点击加载都是使用页面初始化时使用的用户操作标识

方法1:public void pushResultBean(String 用户操作标识,ResultBean resultBean) ;添加ResultBean到resultMap中,key为用户操作标识;

方法2: public ResultBean getResultBean(String 用户操作标识) 根据用户操作标识取得ResultBean;

方法 3:public void removeResultBean(String 用户操作标识);通过用户操作标识remove

3.接口层

通过用户标识调用单例工具类的ResultUtil.getResultBean方法,通过得到的ResultBean再调用getResultList方法,当getResultList方法返回结果为空将调用ResultUtil.removeResultBean方法

4.前端

每次通过用户操作标识请求接口,得到响应结果追加即可

机优化方案:还需要ResultUtil中的resultMap回收,可以考虑使用websoket,或者心跳机制,想简单的话先用心跳机制解决,单独开一个接口,前端定时调用,如果超过三十秒该用户操作标识没有心跳检测调用ResultUtil.removeResultBean方法,若是用户体量大的话考虑使用netty

Java 实现子线程返回值的几种方法

有三种:

(1)继承Thread类,重写run函数

创建:

class xx extends Thread{

public void run(){

Thread.sleep(1000) //线程休眠1000毫秒,sleep使线程进入Block状态,并释放资源

}}

开启线程:

对象.start() //启动线程,run函数运行

(2)实现Runnable接口,重写run函数

开启线程:

Thread t = new Thread(对象) //创建线程对象

t.start()

(3)实现Callable接口,重写call函数

Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。

Callable和Runnable有几点不同:

①Callable规定的方法是call(),而Runnable规定的方法是run().

②Callable的任务执行后可返回值,而Runnable的任务是不能返回值的

③call()方法可抛出异常,而run()方法是不能抛出异常的。

④运行Callable任务可拿到一个Future对象,Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等

待计算的完成,并检索计算的结果.通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果

java多线程返回结果的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java有返回值的线程、java多线程返回结果的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-25,除非注明,否则均为首码项目网原创文章,转载请注明出处。