java并发编程之future模式

1、当你想并发去执行一段代码,但是还想获取这段代码的返回结果,那么future多线程模式就可以派上用场了,代码实现如下。

public class Client {
public Data request() {
final FutureData futureData = new FutureData();
new Thread(new Runnable() {
@Override
public void run() {
futureData.setRealData(new RealData());
}
}).start();
return futureData;
}
}
public interface Data {
public String get();
}
public class FutureData implements Data{
private RealData realData = null;
private boolean ok = false;
public RealData getRealData() {
return realData;
}
public synchronized void setRealData(RealData realData) {
this.realData = realData;
ok = true;
notify();
}
@Override
public synchronized String get() {
try {
if(!ok) {
this.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return realData.get();
}
}
public class RealData implements Data {
public RealData() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public String get() {
return "hello world!";
}
}
public class main {
public static void main(String[] args) {
Client client = new Client();
Data data = client.request();
System.out.println(data.get());
}
}

2、jdk1.5也提供了支持,代码如下。

public class RealData implements Callable<String> {
public String call() throws Exception {
int sum = 0;
for(int i = 0; i < 100; i++) {
sum += i;
}
return String.valueOf(sum);
}
}
public class main {
public static void main(String[] args) throws InterruptedException, ExecutionException {
FutureTask<String> futureTask = new FutureTask<String>(new RealData());
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(futureTask);
System.out.println(futureTask.get());;
}
}

java并发编程之future模式

时间: 2024-10-26 16:27:56

java并发编程之future模式的相关文章

java并发编程之Master-Worker模式

Master-Worker模式适合在一个任务可以拆分成多个小任务来进行的情况下使用. package cn.fcl.masterworker; import java.util.HashMap; import java.util.Map; import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; public c

java并发编程之Guarded Suspention

当客户端请求速度远远大于服务端的处理速度,这时候就非常适合使用Guarded Suspention模式 package cn.fcl.guardendSuspension; import java.util.ArrayList; import java.util.List; public class RequestQueue { private List<Integer> integers = new ArrayList<Integer>(); public synchronize

Java并发编程之volatile的理解

Java并发编程之volatile关键字的理解 Java中每个线程都有自己的工作内存,类比于处理器的缓存,线程的工作内存中保存了被该线程使用到的变量的主内存的拷贝.线程读写变量都是直接在自己的工作内存中进行的,而何时刷新数据(指将修改的结果更新到主存或者把主存的变量读取覆盖掉工作内存中的值)是不确定的. volatile关键字是修饰字段的关键字,貌似是JDK1.5之后才有的,在多线程编程中,很大的几率会用到这个关键字,volatile修饰变量后该变量有这么一种效果:线程每一次读该变量都是直接从主

Java并发编程之ConcurrentHashMap

ConcurrentHashMap ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法.ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁. ConcurrentHashMap的内部结构 ConcurrentHashMap为了提高本身的并发能力,在内部采用了一个叫做Segment

Java并发编程之set集合的线程安全类你知道吗

Java并发编程之-set集合的线程安全类 Java中set集合怎么保证线程安全,这种方式你知道吗? 在Java中set集合是 本篇是<凯哥(凯哥Java:kagejava)并发编程学习>系列之<并发集合系列>教程的第二篇: 本文主要内容:Set集合子类底层分别是什么?基于底层为什么set的子类可以存放一个数据?怎么解决set线程安全问题? 一:Set集合子类 Set的三个子类分别是:HaseSet.TreeSet.LinkedHashSet.这三个都是线程不安全的.那么这三个子类

Java并发编程之Condition

1.使用synchronized中的等待和唤醒实现消费者和生产者模式 /** * 使用Synchronized实现消费者生产者模式 */ public class SynchronizedDemo { static List<Integer> list = new ArrayList<Integer>(); private static int maxNum = 5; // 消费者 private void Consumer(String name){ synchronized (

Java并发编程之Callable,Future,FutureTask

创建线程: 1. 继承Thread 2. 实现Runnable 仔细观察会发现void run() ,这个方法没有返回值,也就无法获得线程执行结果. Callable 返回结果并且可能抛出异常的任务.实现者定义了一个不带任何参数的叫做 call 的方法. Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的.但是 Runnable 不会返回结果,并且无法抛出经过检查的异常. V call() 计算结果,如果无法计算结果,则抛出一个异常. 跟Runna

java多线程编程之Future/FutureTask和Callable

有这样一种场景,用多线程发送数据到某个服务器,需要知道各个线程是否都发送成功,等所有线程都发送完成才能继续下一轮计算和发送.如果用传统的多线程方式,就需要启动多个线程,然后在每个线程中分别发送数据,外部通过某种方式等待各个线程全部都发送完成,再进行后面的计算等流程.这种实现方式的代码会比较臃肿,在java中提供了一种Callable+Future的方法,可以将异步的多线程调用变为同步方式. Callable 在java的多线程编程中,有Thread和Runnable两种方式来新建线程,其中Run

java并发编程之volatile关键字

1.volatile的作用 一个线程共享变量(类的成员变量.类的静态成员变量等)被volatile修饰之后,就具有以下作用: 1)并发中的变量可见性(不同线程对该变量进行操作时的可见性),即一个线程修改了某个变量的值,则该新值对其他线程立即可见(可立即访问新值/立即强制写入主存): 2)禁止指令重排(包括java编译器和CPU运行时指令重排序): 3)禁用缓存(java虚拟机规范)---子线程的工作内存(包括了CPU缓存). 2.相关概念 2.1)指令重排序: (1)java编译器运行时指令重排