多线程编程,主线程怎么等待多接口数据返回

carl-zhao
博客专家认证
2014-07-16 05:59:20
需求:需要提供一个数据接口,使用利用多线程查询出用户需要展现的各种信息。怎么让主线程等待那么多接口返回。请各位高手提出一些解决方案。我的表述可能不太清楚哈。请见谅。
...全文
704 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
carl-zhao 2014-07-18
  • 打赏
  • 举报
回复
引用 10 楼 oh_Maxy 的回复:
[quote=引用 8 楼 u012410733 的回复:] [quote=引用 1 楼 oh_Maxy 的回复:] 用线程池结合Callable接口实现。 LZ搜搜Callable,和Runable同为多线程实现方法,只是前者会返回Future对象,然后Future的get方法会返回Callable里的方法的结果。
我这个需求是多个主线程要并发(因为有可能有多个人同时查询一个客户的信息),然后就是一级子线程需要并发的查询用户的部分信息。然后就是一级子线程查询的结果作为条件再进行二级子查询。就是这个并发涉及到3级。1级就是主查询的数据汇总(多人查询同一个客户涉及并发),2级就是并发的查询数据(并发查询减少查询时间),3级就是以2级查询的某些结果作为条件再进行3级子查询。大家有什么好的思路吗?[/quote] 不管你是几级并发,只要是想实现线程计算结果汇总的,都可以通过实现Callable的方式实现。 你现在的困难点是什么?线程实现上的问题,应该没问题了吧?[/quote]主要是现在我自己建立不起来模型,而且你怎么判断那些线程是否完成,还有就是超时控制。主要是我是第一次弄多线程。之前没有接触过。自己脑袋中没有什么思路。你就说实现一个Callable接口这个太笼统了。能不能给个具体的解决方案呢?谢谢。
oh_Maxy 2014-07-18
  • 打赏
  • 举报
回复
引用 8 楼 u012410733 的回复:
[quote=引用 1 楼 oh_Maxy 的回复:] 用线程池结合Callable接口实现。 LZ搜搜Callable,和Runable同为多线程实现方法,只是前者会返回Future对象,然后Future的get方法会返回Callable里的方法的结果。
我这个需求是多个主线程要并发(因为有可能有多个人同时查询一个客户的信息),然后就是一级子线程需要并发的查询用户的部分信息。然后就是一级子线程查询的结果作为条件再进行二级子查询。就是这个并发涉及到3级。1级就是主查询的数据汇总(多人查询同一个客户涉及并发),2级就是并发的查询数据(并发查询减少查询时间),3级就是以2级查询的某些结果作为条件再进行3级子查询。大家有什么好的思路吗?[/quote] 不管你是几级并发,只要是想实现线程计算结果汇总的,都可以通过实现Callable的方式实现。 你现在的困难点是什么?线程实现上的问题,应该没问题了吧?
luolongdragon 2014-07-18
  • 打赏
  • 举报
回复
什么叫多并发,3级查询2级查询的结果找?那就3级2级可以看成一个线程。根本就没有涉及到3级, 就是个多并发而已。。。每个查完调用一个公共方法,公共方法判断用户需要的信息是否齐全,就是(if(user_name_flag&&user_other_flag)){}差不多这样,如果完成,触发就激活主线程,返回用户信心给请求..
carl-zhao 2014-07-18
  • 打赏
  • 举报
回复
引用 1 楼 oh_Maxy 的回复:
用线程池结合Callable接口实现。 LZ搜搜Callable,和Runable同为多线程实现方法,只是前者会返回Future对象,然后Future的get方法会返回Callable里的方法的结果。
我这个需求是多个主线程要并发(因为有可能有多个人同时查询一个客户的信息),然后就是一级子线程需要并发的查询用户的部分信息。然后就是一级子线程查询的结果作为条件再进行二级子查询。就是这个并发涉及到3级。1级就是主查询的数据汇总(多人查询同一个客户涉及并发),2级就是并发的查询数据(并发查询减少查询时间),3级就是以2级查询的某些结果作为条件再进行3级子查询。大家有什么好的思路吗?
seqwait 2014-07-18
  • 打赏
  • 举报
回复
CyclicBarrie一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态
kky2010_110 2014-07-18
  • 打赏
  • 举报
回复
多线程设计模式Future Parttern
oh_Maxy 2014-07-18
  • 打赏
  • 举报
回复
引用 11 楼 u012410733 的回复:
[quote=引用 10 楼 oh_Maxy 的回复:] [quote=引用 8 楼 u012410733 的回复:] [quote=引用 1 楼 oh_Maxy 的回复:] 用线程池结合Callable接口实现。 LZ搜搜Callable,和Runable同为多线程实现方法,只是前者会返回Future对象,然后Future的get方法会返回Callable里的方法的结果。
我这个需求是多个主线程要并发(因为有可能有多个人同时查询一个客户的信息),然后就是一级子线程需要并发的查询用户的部分信息。然后就是一级子线程查询的结果作为条件再进行二级子查询。就是这个并发涉及到3级。1级就是主查询的数据汇总(多人查询同一个客户涉及并发),2级就是并发的查询数据(并发查询减少查询时间),3级就是以2级查询的某些结果作为条件再进行3级子查询。大家有什么好的思路吗?[/quote] 不管你是几级并发,只要是想实现线程计算结果汇总的,都可以通过实现Callable的方式实现。 你现在的困难点是什么?线程实现上的问题,应该没问题了吧?[/quote]主要是现在我自己建立不起来模型,而且你怎么判断那些线程是否完成,还有就是超时控制。主要是我是第一次弄多线程。之前没有接触过。自己脑袋中没有什么思路。你就说实现一个Callable接口这个太笼统了。能不能给个具体的解决方案呢?谢谢。[/quote] 在网上down了个案例,然后补充下注释:http://auguslee.iteye.com/blog/1292335

// 类似实现Runnable,这里实现自己的线程任务,假设返回的结果为String
class TaskWithResult implements Callable<String> {
	private int id;

	public TaskWithResult(int id) {
		this.id = id;
	}

	@Override
	public String call() throws Exception {
		return "result of TaskWithResult " + id;
	}
}

public class CallableTest {
	public static void main(String[] args) throws InterruptedException,
			ExecutionException {
		// 这个线程池可以根据需要实例化不同的线程池
		ExecutorService exec = Executors.newCachedThreadPool();
		
		List<Future<String>> results = new ArrayList<Future<String>>();	//Future 相当于是用来存放Executor执行的结果的一种容器
		for (int i = 0; i < 10; i++) {
			// 这里之所以先将返回的Future放到List中,是避免串行化执行线程;先将任务放入线程池,再一个个调取结果
			results.add(exec.submit(new TaskWithResult(i)));
		}
		for (Future<String> fs : results) {
		// 这个if判断可以去掉,就会变成阻塞式等等线程结果;不去掉的话,需要更复杂的实现来做多次遍历,以避免漏掉某个线程结果
			if (fs.isDone()) {
			// 这里的get方法,会将String的结果拿到。
				System.out.println(fs.get());
			} else {
				System.out.println("Future result is not yet complete");
			}
		}
		exec.shutdown();
	}
}
致知Fighting 2014-07-18
  • 打赏
  • 举报
回复
java.util.concurrent.CyclicBarrier
晓风吹雾 2014-07-17
  • 打赏
  • 举报
回复
1. thread join 2. object wait notify 3. condition await signal 4 LockSupport park thread -> LockSupport .unpark
oh_Maxy 2014-07-17
  • 打赏
  • 举报
回复
引用 5 楼 SDN_SUPERUSER 的回复:
[quote=引用 1 楼 oh_Maxy 的回复:] 用线程池结合Callable接口实现。 LZ搜搜Callable,和Runable同为多线程实现方法,只是前者会返回Future对象,然后Future的get方法会返回Callable里的方法的结果。
这个我在核心卷一上看到过,还写了小列子。现在找不到了。[/quote] 步骤基本上和Runnable方式差不多,就是Callable会多返回一个Future,拿到这个Future引用,调用其get方法即可。
jackson_fighting 2014-07-17
  • 打赏
  • 举报
回复
引用 1 楼 oh_Maxy 的回复:
用线程池结合Callable接口实现。 LZ搜搜Callable,和Runable同为多线程实现方法,只是前者会返回Future对象,然后Future的get方法会返回Callable里的方法的结果。
这个我在核心卷一上看到过,还写了小列子。现在找不到了。
疯癫行者 2014-07-17
  • 打赏
  • 举报
回复

import java.util.concurrent.*;

ExecutorService pool = Executors.newCachedThreadPool();
for(int i=0; i<10; i++){
  pool.execute(new Runnable(){
    public void run(){
        ......  //some code.
    }
  });
}
pool.shutdown();
pool.awaitTermination(1, TimeUnit.DAYS);  //主线程将在这里停住,直到所有线程执行完毕或者超时(这里是1天)。
lsongiu86 2014-07-17
  • 打赏
  • 举报
回复
最简单的方法,弄一个static的blockingqueue,多线程往里放入数据,主线程take
yanghongjy 2014-07-17
  • 打赏
  • 举报
回复
1.主线程用 sleep 再检测是否可用 2.主线程用 wait(); 有数据再 notify 用 ExecutorService 线程池 Executors.newFixedThreadPool(thread_num);
oh_Maxy 2014-07-16
  • 打赏
  • 举报
回复
用线程池结合Callable接口实现。 LZ搜搜Callable,和Runable同为多线程实现方法,只是前者会返回Future对象,然后Future的get方法会返回Callable里的方法的结果。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧