`
xmgestapo
  • 浏览: 5916 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

多线程 各线程返回值控制

阅读更多
在网上看到很多同事问多线程时,获取子线程的返回值的问题,今天特意看了一下,其实JDK1.6里面已经完全支持了

不但可以控制子线程的返回值,对于子线程的超时时间和终止,取消等都支持

public List<Long> getIdList(ScoreDoc[] scoreDocs, IndexSearcher search)
            throws CorruptIndexException, IOException, InterruptedException, ExecutionException {
        final int records = 10000;
        int len = scoreDocs.length;
        List<ScoreDoc[]> scoreDocList = new ArrayList<ScoreDoc[]>(len);
        Map<String, FieldSelectorResult> fieldSelections = new HashMap<String, FieldSelectorResult>(
                1);
        fieldSelections.put("id", FieldSelectorResult.LOAD);
        FieldSelector fieldSelector = new MapFieldSelector(fieldSelections);
        int threadCount = len / records;
        int modCount = len % records;
        int srcPos = 0;
        if (threadCount > 0 && modCount != 0) {
            for (int i = 0; i < threadCount; i++) {
                ScoreDoc[] idsArry = new ScoreDoc[records];
                System.arraycopy(scoreDocs, srcPos, idsArry, 0, records);
                scoreDocList.add(idsArry);
                srcPos = srcPos + records;
            }
            ScoreDoc[] idsArry = new ScoreDoc[modCount];
            System.arraycopy(scoreDocs, srcPos, idsArry, 0, modCount);
            scoreDocList.add(idsArry);

        } else if (threadCount == 0 && modCount != 0) {
            ScoreDoc[] idsArry = new ScoreDoc[modCount];
            System.arraycopy(scoreDocs, 0, idsArry, 0, modCount);
            scoreDocList.add(idsArry);
        }

        Executor executor = Executors.newFixedThreadPool(scoreDocList.size());
        List<Long> ids = new ArrayList<Long>(len);
        for (int i = 0; i < scoreDocList.size(); i++) {
            FutureTask<List<Long>> task = new FutureTask<List<Long>>(new ReadDoc(
                    scoreDocList.get(i), search, fieldSelector));
            executor.execute(task);
            ids.addAll(task.get());
        }

        return ids;
    }

//线程实现类
    class ReadDoc implements Callable<List<Long>> {
        private ScoreDoc[]    scoreDocs;
        private IndexSearcher search;
        private FieldSelector fieldSelector;

        public ReadDoc(ScoreDoc[] scoreDocs, IndexSearcher search, FieldSelector fieldSelector) {
            this.scoreDocs = scoreDocs;
            this.search = search;
            this.fieldSelector = fieldSelector;
        }

        /*
         * (non-Javadoc)
         * @see java.util.concurrent.Callable#call()
         */
        @Override
        public List<Long> call() throws Exception {
            List<Long> ids = new ArrayList<Long>();
        获取ID集合
            for (int i = 0; i < scoreDocs.length; i++) {
                Document doc = search.doc(scoreDocs[i].doc, fieldSelector);
                ids.add(Long.valueOf(doc.getFieldable("id").stringValue()));
            }
            return ids;
        }
    }
0
0
分享到:
评论

相关推荐

    vc中获取一个线程的状态及返回值

    5. **线程返回值**: - 线程函数可以通过`ExitThread()`函数设置线程的退出代码,这个值可以通过`GetExitCodeThread()`函数获取。 - 在VC++中,主线程可以通过`Joinable`线程类的`join()`成员函数等待子线程结束并...

    python使用threading获取线程函数返回值的实现方法

    在给定的描述中,作者面临的问题是如何在一个环境搭建工具中,通过多线程并行执行操作,并收集每个操作的返回值来判断所有操作是否成功。为了解决这个问题,作者创建了一个名为`MyThread`的类,这个类封装了多线程...

    C++多线程获取返回值方法详解

    在C++多线程编程中,获取线程返回值是一个很重要的 topic。在C++11标准中,std::thread对象会忽略顶层函数的返回值,这就使得获取线程返回值变得困难。下面我们将详细介绍两种获取返回值的方法:传统方法和C++11方法...

    Future执行具有返回值的线程.txt

    大家都知道实现多线程的2种方式,今天来讲讲Future实现具有返回值的线程。应用场景:前端调用时无需等待线程结束返回,线程结束后需进行其它操作如更新状态、通知kafuka等。

    有返回值的线程

    同时,`jdbctest`可能涉及到了如何在多线程环境下使用JDBC,比如在一个线程中执行查询,然后在另一个线程中处理结果,这与我们的主题“有返回值的线程”相吻合。 总之,要实现有返回值的线程,我们可以使用Java的`...

    易语言线程返回数据的方法

    互斥量则用于保护数据,防止多线程并发访问时出现冲突。 四、线程返回数据的方法 1. **使用全局变量**:线程执行完毕后,可以修改全局变量,然后由主线程或其他线程读取。这种方式简单,但不适用于复杂的同步需求。...

    C#多线程函数如何传参数和返回值[归类].pdf

    "C#多线程函数如何传参数和返回值" 在C#中,多线程函数的参数传递和返回值处理是非常重要的。多线程函数可以使用委托(delegates)来实现参数的传递和返回值的处理。 委托是具有同样参数和返回值的函数的集合。...

    Python多线程获取返回值代码实例

    这个`parse_detail_page`函数可以处理多个URL,每个URL都在一个独立的线程中处理,最后返回一个包含所有线程返回值的列表。 需要注意的是,使用`join()`方法是必要的,因为它确保主线程等待所有子线程结束,防止在...

    linux多线程编程.pdf

    Linux多线程编程是操作系统中并发程序设计的一个重要领域,它允许开发者在同一程序中创建多个线程,以实现并行执行,从而提高程序的执行效率和响应能力。Linux下的多线程编程通常基于POSIX线程(pthread)库来实现,...

    python获取多线程及子线程的返回值

    最近有个需求,用多线程比较合适,但是我需要每个线程的返回值,这就需要我在threading.Thread的基础上进行封装 import threading class MyThread(threading.Thread): def __init__(self,func,args=()): super...

    用 setjmp 和 longjmp 实现多线程(1)_多线程_

    在C语言中,setjmp和longjmp是两个与异常处理和非局部跳转相关的函数,它们可以被用来实现一种特殊的多线程效果。虽然这两个函数并非设计为创建和管理线程的标准方法,但在某些特定场景下,它们可以模拟多线程的行为...

    多线程发邮件

    在IT行业中,多线程技术是一项重要的编程技巧,特别是在处理并发任务时,它能显著提升程序的执行效率。本示例“多线程发邮件”就是利用了这一特性,通过并发执行多个邮件发送任务,来加快邮件的发送速度。下面我们将...

    java多线程处理数据库数据

    然而,为了更好地管理和控制线程,Java并发包提供了如`ExecutorService`、`Future`、`Callable`等高级接口和类,它们简化了多线程编程,并提供了更好的资源管理。 在处理数据库数据时,我们通常会使用JDBC(Java ...

    利用MFC进行多线程编程

    在Windows平台上进行应用程序开发时,Microsoft Foundation Class (MFC) 库提供了一种方便的方式来实现多线程编程。MFC是Microsoft为C++开发者设计的一个类库,它封装了Windows API,使得创建复杂的Windows应用程序...

    linux多线程编程ppt

    【Linux多线程编程】是Linux系统开发中的一个重要主题,主要涉及如何在Linux环境中创建、管理和同步线程。华清远见的这份PPT为学习者提供了深入的理解和实践指导。 在Linux系统中,线程是进程内的执行单元,是...

    linux pthread 多线程控制示例代码

    下面我们将详细探讨`pthread`库中的关键函数以及它们在多线程控制中的作用。 1. `pthread_create()`: 这个函数用于创建新的线程。它接受四个参数:线程ID的指针、线程属性(可选)、线程入口点函数和传递给该函数的...

    POSIX多线程程序设计

    在深入探索 POSIX 多线程程序设计之前,我们需要了解POSIX(可移植操作系统接口)是一个定义一系列UNIX系统服务的接口标准,这些服务包括文件处理、进程控制、信号处理、定时器、多线程等,POSIX标准让编写的应用...

Global site tag (gtag.js) - Google Analytics