在网上看到很多同事问多线程时,获取子线程的返回值的问题,今天特意看了一下,其实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;
}
}
分享到:
相关推荐
5. **线程返回值**: - 线程函数可以通过`ExitThread()`函数设置线程的退出代码,这个值可以通过`GetExitCodeThread()`函数获取。 - 在VC++中,主线程可以通过`Joinable`线程类的`join()`成员函数等待子线程结束并...
在给定的描述中,作者面临的问题是如何在一个环境搭建工具中,通过多线程并行执行操作,并收集每个操作的返回值来判断所有操作是否成功。为了解决这个问题,作者创建了一个名为`MyThread`的类,这个类封装了多线程...
在C++多线程编程中,获取线程返回值是一个很重要的 topic。在C++11标准中,std::thread对象会忽略顶层函数的返回值,这就使得获取线程返回值变得困难。下面我们将详细介绍两种获取返回值的方法:传统方法和C++11方法...
大家都知道实现多线程的2种方式,今天来讲讲Future实现具有返回值的线程。应用场景:前端调用时无需等待线程结束返回,线程结束后需进行其它操作如更新状态、通知kafuka等。
互斥量则用于保护数据,防止多线程并发访问时出现冲突。 四、线程返回数据的方法 1. **使用全局变量**:线程执行完毕后,可以修改全局变量,然后由主线程或其他线程读取。这种方式简单,但不适用于复杂的同步需求。...
同时,`jdbctest`可能涉及到了如何在多线程环境下使用JDBC,比如在一个线程中执行查询,然后在另一个线程中处理结果,这与我们的主题“有返回值的线程”相吻合。 总之,要实现有返回值的线程,我们可以使用Java的`...
"C#多线程函数如何传参数和返回值" 在C#中,多线程函数的参数传递和返回值处理是非常重要的。多线程函数可以使用委托(delegates)来实现参数的传递和返回值的处理。 委托是具有同样参数和返回值的函数的集合。...
这个`parse_detail_page`函数可以处理多个URL,每个URL都在一个独立的线程中处理,最后返回一个包含所有线程返回值的列表。 需要注意的是,使用`join()`方法是必要的,因为它确保主线程等待所有子线程结束,防止在...
Linux多线程编程是操作系统中并发程序设计的一个重要领域,它允许开发者在同一程序中创建多个线程,以实现并行执行,从而提高程序的执行效率和响应能力。Linux下的多线程编程通常基于POSIX线程(pthread)库来实现,...
在C语言中,setjmp和longjmp是两个与异常处理和非局部跳转相关的函数,它们可以被用来实现一种特殊的多线程效果。虽然这两个函数并非设计为创建和管理线程的标准方法,但在某些特定场景下,它们可以模拟多线程的行为...
最近有个需求,用多线程比较合适,但是我需要每个线程的返回值,这就需要我在threading.Thread的基础上进行封装 import threading class MyThread(threading.Thread): def __init__(self,func,args=()): super...
Java的多线程是其编程语言中的一个重要特性,允许在单个程序中同时执行多个...在学习过程中,应重点掌握线程的创建、控制、同步和通信方法,以及如何处理线程安全问题,这样才能在实际项目中游刃有余地运用多线程技术。
在IT行业中,多线程技术是一项重要的编程技巧,特别是在处理并发任务时,它能显著提升程序的执行效率。本示例“多线程发邮件”就是利用了这一特性,通过并发执行多个邮件发送任务,来加快邮件的发送速度。下面我们将...
然而,为了更好地管理和控制线程,Java并发包提供了如`ExecutorService`、`Future`、`Callable`等高级接口和类,它们简化了多线程编程,并提供了更好的资源管理。 在处理数据库数据时,我们通常会使用JDBC(Java ...
在Windows平台上进行应用程序开发时,Microsoft Foundation Class (MFC) 库提供了一种方便的方式来实现多线程编程。MFC是Microsoft为C++开发者设计的一个类库,它封装了Windows API,使得创建复杂的Windows应用程序...
【Linux多线程编程】是Linux系统开发中的一个重要主题,主要涉及如何在Linux环境中创建、管理和同步线程。华清远见的这份PPT为学习者提供了深入的理解和实践指导。 在Linux系统中,线程是进程内的执行单元,是...
在IT行业中,多线程和线程池是提高程序并发性能和资源管理的关键技术。尤其在Java编程领域,它们在大型系统和并发密集型应用中扮演着重要角色。本篇文章将详细探讨“常用多线程模板”以及“鱼刺类(Fork/Join框架)...
下面我们将详细探讨`pthread`库中的关键函数以及它们在多线程控制中的作用。 1. `pthread_create()`: 这个函数用于创建新的线程。它接受四个参数:线程ID的指针、线程属性(可选)、线程入口点函数和传递给该函数的...