方法被阻塞,一直要等到线程任务返回结果的例子

package cn.itcast_01_mythread.pool;

import java.util.ArrayList;import java.util.List;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;/** * callable 跟runnable的区别: * runnable的run方法不会有任何返回结果,所以主线程无法获得任务线程的返回值 *  * callable的call方法可以返回结果,但是主线程在获取时是被阻塞,需要等待任务线程返回才能拿到结果 * @author * */public class ThreadPoolWithcallable {

    public static void main(String[] args) throws InterruptedException, ExecutionException {        ExecutorService pool = Executors.newFixedThreadPool(4);                 for(int i = 0; i < 10; i++){            Future<String> submit = pool.submit(new Callable<String>(){                @Override                public String call() throws Exception {                    //System.out.println("a");                    Thread.sleep(5000);                    System.out.println("b--"+Thread.currentThread().getName() +" 我在线程里面执行");                    return "b--"+Thread.currentThread().getName();                }                              });            //从Future中get结果,这个方法是会被阻塞的,一直要等到线程任务返回结果            System.out.println("我不是阻塞的,啦啦啦啦");            System.out.println(submit.get());        }             pool.shutdown();

    }

}

反之,不阻塞,就是会继续执行不会因为子线程还没有结束而等待,而被阻塞的方法,这会因为某个子线程还没有结束而等待

时间: 2024-11-08 05:49:16

方法被阻塞,一直要等到线程任务返回结果的例子的相关文章

阻塞队列模型和线程池

阻塞队列模型介绍 阻塞队列模型和线程池息息相关,因此本篇博客先介绍阻塞队列的相关知识.如下图所示: 首先我们来说,什么是Queue,然后在谈什么是BlockingQueue. 那么什么是Queue呢?一句话,就是一端进,另一端出,这样就形成了First In , First Out,即先进先出.而BlockingQueue只不过是在Queue的基础上进行了2个附加操作而已:如果Queue空,那么Out线程阻塞,如果Queue满,那么In线程阻塞. 理解了上面的Queue/BlockingQueu

python多线程编程之Queue---put/get 方法的阻塞

python 中,队列是线程间最常用的交换数据的形式.Queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外. 1. 阻塞模式导致数据污染 import Queue       q = Queue.Queue(10)       for i in range(10):               myData = 'A'               q.put(myData)               myData = 'B' 这是一段极其简单的代码,但我总是不能

Java总结(九)——(线程模块 一(线程的创建(方法一)与启动,线程状态与生命周期,进程与线程))

一.进程与线程 进程:每一个独立运行的程序称为一个进程 线程:线程时一个进程内部的一条执行路径,Java虚拟机允许程序并发的运行多个执行路径 *进程中执行运算的最小单位-->线程<--处理机分配 进程与线程的区别: (1)进程有独立的运行地址空间,一个进程崩溃后不会影响到其他的进程,而线程只是 一个进程中的一个执行路径,如果有一条线程奔溃了,可能会影响到进程中的的其他线程 (2)线程有自己的栈和局部变量,多个线程共享同一进程的地址空间 (3)一个进程至少有一个线程 多线程 (1)多线程 就是在

方法阻塞,方法一直阻塞,意味着这个程序卡在这里,一直不向下运行。知道这个阻塞方法执行完毕,有返回值。程序才继续向下执行

方法阻塞,方法一直阻塞,意味着这个程序卡在这里,一直不向下运行.知道这个阻塞方法执行完毕,有返回值.程序才继续向下执行. while (true) { // 当注册事件到达时,方法返回,否则该方法会一直阻塞 selector.select();  //这里将一直阻塞,程序不会向下执行.直到这个方法执行完,有返回值后 2.// 采用轮询的方式监听selector上是否有需要处理的事件,如果有,则进行处理 NIO SERVER NIO SERVERpackage com.anders.selecto

BeginInvoke 方法真的是新开一个线程进行异步调用吗?

转自原文BeginInvoke 方法真的是新开一个线程进行异步调用吗? 参考以下代码: public delegate void treeinvoke(); private void UpdateTreeView() { MessageBox.Show(System.Threading.Thread.CurrentThread.Name); } private void button1_Click(object sender, System.EventArgs e) { System.Threa

线程待返回值等问题

问题一,线程的基本操作,例如:暂停.继续.停止等 我不建议使用Thread类提供的Suspend.Resume以及Abort这三个方法,前两个有问题,好像在VS05已经屏蔽这两个方法:对于Abort来说,除了资源没有得到及时释放外,有时候会出现异常.如何做呢,通过设置开关变量来完成 问题二,如何向线程传递参数或者从中得到其返回值: 我不建议使用静态成员来完成,仅仅为了线程而破坏类的封装有些得不偿失.那如何做呢,通过创建单独的线程类来完成 //委托 public delegate double w

Java多线程——&lt;四&gt;让线程有返回值

一.概述 到目前为止,我们已经能够声明并使一个线程任务运行起来了.但是遇到一个问题:现在定义的任务都没有任何返回值,那么加入我们希望一个任务运行结束后告诉我一个结果,该结果表名任务执行成功或失败,此时该怎么办呢? 答案是使用Callable.之前定义的任务都直接实现了Runnable,该接口的run方法并无返回值.而Callable的call方法可以根据你传入的泛型参数返回对应类型的数据. 二.实现 1.实现Callable接口,定义可返回结果的线程任务 public class TaskCal

在Java 线程中返回值的用法

http://icgemu.iteye.com/blog/467848 在Java 线程中返回值的用法 博客分类: Java Javathread 有时在执行线程中需要在线程中返回一个值:常规中我们会用Runnable接口和Thread类设置一个变量:在run()中改变变量的值,再用一个get方法取得该值,但是run何时完成是未知的:我们需要一定的机制来保证. 在在Java se5有个Callable接口:我们可以用该接口来完成该功能: 代码如: Java代码   package com.thr

【Linux】一个简单的线程创建和同步的例子

最近很多精力在Linux上,今天简单看了一下Linux上的线程和同步,其实不管windows还是Linux,OS层面的很多原理和概念都是相同的,很多windows之上的经验和概念完全可以移植到Linux上. 今天用到了创建线程和一个阻塞式的线程同步函数. 用到的几个函数 #include <pthread.h> //创建线程 int pthread_create( pthread_t* thread, /*线程标ID, pthread_t pthread_self(void) 可获取当前线程I