线程池 40个一组去调用

package net.joystart.order.entity;

public class DrivingTrack {
	private String id;
	private String sn;
	private String idc;
	private Long gpsTime;
	private Double longitude;
	private Double latitude;
	private Integer speed;
	private Integer direction;
	private Integer altitude;
	private String showtime;
	private String showlng;
	private String showlat;
	private String flag;//选择set参数标示 add cjl 有疑问找崔金龙
	
	
	public String getShowlng() {
		return showlng;
	}
	public void setShowlng(String showlng) {
		this.showlng = showlng;
	}
	public String getShowlat() {
		return showlat;
	}
	public void setShowlat(String showlat) {
		this.showlat = showlat;
	}
	public String getShowtime() {
		return showtime;
	}
	public void setShowtime(String showtime) {
		this.showtime = showtime;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getSn() {
		return sn;
	}
	public void setSn(String sn) {
		this.sn = sn;
	}
	public String getIdc() {
		return idc;
	}
	public void setIdc(String idc) {
		this.idc = idc;
	}
	
	public Long getGpsTime() {
		return gpsTime;
	}
	public void setGpsTime(Long gpsTime) {
		this.gpsTime = gpsTime;
	}
	public Double getLongitude() {
		return longitude;
	}
	public void setLongitude(Double longitude) {
		this.longitude = longitude;
	}
	public Double getLatitude() {
		return latitude;
	}
	public void setLatitude(Double latitude) {
		this.latitude = latitude;
	}
	public Integer getSpeed() {
		return speed;
	}
	public void setSpeed(Integer speed) {
		this.speed = speed;
	}
	public Integer getDirection() {
		return direction;
	}
	public void setDirection(Integer direction) {
		this.direction = direction;
	}
	public Integer getAltitude() {
		return altitude;
	}
	public void setAltitude(Integer altitude) {
		this.altitude = altitude;
	}
	public String getFlag() {
		return flag;
	}
	public void setFlag(String flag) {
		this.flag = flag;
	}
	
	
}

 

package net.joystart.common.util.baiDu;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import javax.annotation.Resource;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonSyntaxException;

import net.joystart.common.util.HttpRequestUtil;
import net.joystart.common.util.baiDu.BaiDuAPIUtil.BaiduPosition;
import net.joystart.common.util.date.UtilTimeFormatter;
import net.joystart.order.entity.DrivingTrack;

public class GpsTransformation {

	@Resource
	RedisTemplate<String, String> redisTemplate;
	List<DrivingTrack> queue =  Collections.synchronizedList(new ArrayList<DrivingTrack>());

	public List<DrivingTrack> transformation(List<DrivingTrack> list) {
		int qSize = new BigDecimal(list.size()).divide(new BigDecimal(40),0,BigDecimal.ROUND_UP).intValue();
		BlockingQueue<Runnable> workQueue=new LinkedBlockingQueue<Runnable>();
		ThreadPoolExecutor pool = new ThreadPoolExecutor(1, qSize, 600, TimeUnit.SECONDS, workQueue);
		
		for(int i=0;i<qSize;i++){
			List<DrivingTrack> groupList = new ArrayList<DrivingTrack>();
			if(list.size() <= 40){
				groupList = list;
			}else{
				
				for(int j=0;j<=40;j++){
					groupList.add(list.remove(0));
				}
			}
			pool.submit(new TransformationBaidu(groupList));
		}
		while(workQueue.size()>1) {  
            try{  
            Thread.sleep(500);
            }catch(Exception ex)
            {
            	
            }
            
        }  
        
        pool.shutdown();  
          
        while(!pool.isTerminated()) {  
        	try
        	{
            pool.awaitTermination(5, TimeUnit.MINUTES);
        	}
        	catch(Exception ex)
        	{}
        }
        
        extracted();
        
		
		
		
		return queue;
	}

	@SuppressWarnings("unchecked")
	private void extracted() {
		Collections.sort(queue, new SortByID());
	}

	private class TransformationBaidu implements Runnable {

		@Resource
		RedisTemplate<String, String> redisTemplate;
		private List<DrivingTrack> list;
		

		public TransformationBaidu(List<DrivingTrack> list) {
			this.list = list;
		}

		@Override
		public void run() {
			try {
				Integer iCount = list.size();
				// gps坐标转换成百度坐标
				String url = "http://api.map.baidu.com/geoconv/v1/?";
				List<String> str = new ArrayList<String>();
				for (int i = 0; i < iCount; i++) {
					str.add(i, list.get(i).getLongitude() + "," + list.get(i).getLatitude());
				}
				String coords = String.join(";", str);
				StringBuffer param = new StringBuffer();
				param.append("ak=");
				param.append("eOfOqm3LclumR9fg7bIguqcv");
				param.append("&coords=");
				param.append(coords);
				String result = HttpRequestUtil.sendGet(url, param.toString());

				Gson gson = new Gson();

				BaiduPosition obj = gson.fromJson(result, BaiduPosition.class);
				for (int i = 0; i < iCount; i++) {
					DrivingTrack model = new DrivingTrack();
					DrivingTrack oldModel = list.get(i);
					model.setId(oldModel.getId());
					model.setLongitude(new Double(obj.getResult().get(i).getX()));
					model.setLatitude(new Double(obj.getResult().get(i).getY()));
					if(StringUtils.isEmpty(oldModel.getFlag())){
						model.setSn(oldModel.getSn());
						model.setIdc(oldModel.getIdc());
						model.setGpsTime(oldModel.getGpsTime());
						model.setSpeed(oldModel.getSpeed());
						model.setDirection(oldModel.getDirection());
						model.setAltitude(oldModel.getAltitude());
						model.setShowtime(UtilTimeFormatter.getTimeToYMDHMS(oldModel.getGpsTime()));
						model.setShowlng(getGpsLongitudeDisplayName(new Double(obj.getResult().get(i).getX())));
						model.setShowlat(getGpsLatitudeDisplayName(new Double(obj.getResult().get(i).getY())));
					}
					//String string = gson.toJson(model);

					// 将数据存入redis中
					// redisTemplate.opsForZSet().add(key, string, new
					// Double(model.getId()));
					queue.add(model);
				}
			} catch (JsonSyntaxException e) {
				e.printStackTrace();
			} catch (NumberFormatException e) {
				e.printStackTrace();
			}
		}
		
		
        public String getGpsLongitudeDisplayName(Double longitude)
        {
            double t = Math.abs(longitude);
            int d = (int)Math.abs(longitude);
            int m = (int)((t - d) * 60);
            double s = ((t - d) * 60 - m) * 60;
            
            BigDecimal b = new BigDecimal(s);
            double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
            return (longitude > 0 ? "东" : "西")+"经"+d+"°"+m+"′"+String.format("%.2f", f1)+"″";
        }

        public String getGpsLatitudeDisplayName(Double latitude)
        {
            double t = Math.abs(latitude);
            int d = (int)Math.abs(latitude);
            int m = (int)((t - d) * 60);
            double s = ((t - d) * 60 - m) * 60;
            
            
            BigDecimal b = new BigDecimal(s);
            double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
            return  (latitude > 0 ? "北" : "南")+"纬"+d+"°"+m+"′"+String.format("%.2f", f1)+"″";
        }

	}

	class SortByID implements Comparator {
		public int compare(Object o1, Object o2) {
			DrivingTrack s1 = (DrivingTrack) o1;
			DrivingTrack s2 = (DrivingTrack) o2;
			if (new Long(s1.getId()) > new Long(s2.getId()))
				return 1;
			return 0;
		}
	}
}

 

 

 

posted @ 2017-06-08 16:03  JLCUI  阅读(212)  评论(0编辑  收藏  举报