java 线程池newFixedThreadPool
工作中遇到一个这样的情况,List中的元素要每个遍历出来,然后作为参数传给后面通过spark做数据处理,元素太多,一个一个的遍历速度太慢,于是考虑使用多线程,代码如下:(已删除部分代码)
想了解更多线程池的内容,可以参考链接:https://blog.csdn.net/aa1215018028/article/details/82814192
package com.kong.test.UDF;
import java.util.ArrayList;
import java.util.Iterator;
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;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import com.kong.test.constant.Constants;
public class CallableAndFuture {
public static void main(String[] args) throws InterruptedException, ExecutionException {
SparkSession spark = SparkSession
.builder()
.appName("CalibrationTest")
.master("local")
.enableHiveSupport()
.getOrCreate();
spark.sparkContext().setLogLevel("ERROR");
spark.sparkContext().setLocalProperty("spark.scheduler.pool", "production");
CalibrationSQL cali = new CalibrationSQL(db,branchE,date,date4g,branchC);
Dataset<Row> sqlDF1 = spark.sql(cali.getAllCell());
List<Row> list = sqlDF1.collectAsList();
int threadNum = 10;
ExecutorService threadPool = Executors.newFixedThreadPool(threadNum);
List<Future<Integer>> futures = new ArrayList<Future<Integer>>();
System.out.println("线程数目:"+threadNum);
for (int i = 0; i < list.size(); i++) {
String[] line = list.get(i).toString().replace('[', ' ').replace(']', ' ').trim().split(",");
String antenna_0 = line[0];
String antenna0_googlegri = line[1];
String antenna0_googlegci = line[2];
futures.add(threadPool.submit(new calibration(cali,antenna_0,antenna0_googlegri,antenna0_googlegci,spark)));
}
for (int i = 0; i < futures.size(); i++) {
System.out.println(futures.get(i).get());
}
threadPool.shutdown();System.out.println("threadPool shutdown !");
}
}
class calibration implements Callable<Integer> {
private CalibrationSQL cali;
private String antenna_0;
private String antenna0_googlegri;
private String antenna0_googlegci;
private SparkSession spark;
public calibration(CalibrationSQL cali,String antenna_0,String antenna0_googlegri,String antenna0_googlegci,SparkSession spark) {
this.cali = cali;
this.antenna_0 = antenna_0;
this.antenna0_googlegri = antenna0_googlegri;
this.antenna0_googlegci = antenna0_googlegci;
this.spark = spark;
}
public Integer call() throws Exception {
--处理逻辑--
return 0;
}
}
对每个线程的执行状态加上回调流程,会一直阻塞直至多线程部分全部处理完成。这样不会影响后面的代码处理
java 线程池newFixedThreadPool的更多相关文章
- java 线程池 ---- newFixedThreadPool()
class MyThread implements Runnable{ private int index; public MyThread(int index){ this.index = inde ...
- (CSDN迁移) JAVA多线程实现-可控最大并发数线程池(newFixedThreadPool)
上篇文章中介绍了单线程化线程池newSingleThreadExecutor,可控最大并发数线程池(newFixedThreadPool)与其最大的区别是可以通知执行多个线程,可以简单的将newSin ...
- 一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结
一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结 这是一个十分严重的线上问题 自从最近的某年某月某天起,线上服务开始变得不那么稳定(软病).在高峰期,时常有几台机器的 ...
- java 线程池ThreadPoolExecutor 如何与 AsyncTask() 组合使用。
转载请声明出处谢谢!http://www.cnblogs.com/linguanh/ 这里主要使用Executors中的4种静态创建线程池实例方法中的 newFixedThreadPool()来举例讲 ...
- Java线程池使用说明
Java线程池使用说明 转自:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极 ...
- (转载)JAVA线程池管理
平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...
- Java线程池的那些事
熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor.大家可能了解到它的原理,甚至看过它的源码:但 ...
- 四种Java线程池用法解析
本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...
- Java线程池应用
Executors工具类用于创建Java线程池和定时器. newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThread ...
随机推荐
- 【动态规划法(DP)】-C++
360百科定义: 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家R.E.Bell ...
- BI之路学习笔记3--olap cube理解实例
为什么会产生OLAP? 随着数据库技术的发展应用,数据库存储的数据量从M字节以及G(千兆)字节过渡到T字节和P字节,同时,用户的查询需求也越来越复杂,设计的已不仅是查询或者操纵一张关系表中的一条或几条 ...
- py+selenium遇见IE,元素只有name属性【神奇解决】
问题:当需要自动化测试某系统,而该系统只兼容IE8,怎么办? IE8的问题:IE8不支持getElementByName,而属性中又没有ID,定位难度较大. IE8以下不兼容getElementByN ...
- Excel催化剂开源第12波-VSTO开发遍历功能区所有菜单按钮及自定义函数清单
在插件开发过程中,随着功能越来越多,用户找寻功能入口将变得越来越困难,在Excel催化剂 ,将采用遍历所有功能的方式,让用户可以轻松使用简单的查找功能找到想要功能所在位置,查找的范围有:功能按钮的显示 ...
- 找bug的过程
关于昨天程序出差我找bug的过程记录 昨天才程序 https://www.cnblogs.com/pythonywy/p/11006273.html ├── xxxx │ ├── src.py │ └ ...
- linux作业控制和文件系统
一.作业控制 [root@tianyun ~]# sleep 2000运行一个程序,当前终端无法输入. 1 直接运行后台程序.暂停一个前台程序.[root@tianyun ~]# sleep 300 ...
- kubernetes的volume的权限设置(属主和属组)
apiVersion: v1kind: Podmetadata: name: hello-worldspec: containers: # specification of the pod's c ...
- nginx CRLF(换行回车)注入漏洞复现
nginx CRLF(换行回车)注入漏洞复现 一.漏洞描述 CRLF是”回车+换行”(\r\n)的简称,其十六进制编码分别为0x0d和0x0a.在HTTP协议中,HTTP header与HTTP Bo ...
- HTML--CSS样式表的基本概念
CSS(Cascading Style Sheet 叠层样式表) 作用:美化HTML网页 (一)样式表分类 一.内联样式表 和HTML联合显示,控制精准,但是可重用性差,冗余多. 例如:<p ...
- java数组扩容
有些时候使用数组代替栈,玩意数组容量不够需要扩容 则: 1.Array.toString();直接遍历打印数组 2.数组扩容采用Array.copyOf(),直接实现数组扩容功能,非常强大 (实际 ...