前言:
眼前咱们对“java线程项目”可能比较珍视,朋友们都想要分析一些“java线程项目”的相关内容。那么小编也在网摘上网罗了一些有关“java线程项目””的相关内容,希望你们能喜欢,小伙伴们快快来了解一下吧!多线程在多核或多处理器环境下可以提升CPU使用率,提升程序运行效率。所以使用多线程可以帮助我们设计出响应更快的应用程序。
多线程的使用很广泛,在很多耗时操作时我们都需要使用多线程来提高执行效率,这里举2个栗子,希望对你有帮助。
案例一:使用线程池、多线程、redis队列爬某站点
public class Spider { // 初始化线程池,大小为10 private final static ExecutorService threadPool = Executors.newFixedThreadPool(10); public static void main(String[] args) throws Exception { //初始化redis连接池 JedisPoolConfig config = new JedisPoolConfig(); JedisPool jedisPool = new JedisPool(config, ip, 6379); // 开启10个线程,每个线程做的事情都是(从队列取pid-->爬取商品详情--->解析商品详情---->添加到数据库) for (int i = 0; i <= 9; i++) { threadPool.execute(new Runnable() { public void run() { while (true) { try { jedisPool.jedisPool.getResource(); List<String> list = jedis.brpop(1, "bigdata:spider:jd:urls"); parserProductDetail(list.get(1)); } catch (Exception e) { e.printStackTrace(); } } } }); } } /** * 功能:根据商品id爬取商品详情,解析商品详情,获取商品信息,将商品信息入库 * * @param pId * 商品的id * @throws Exception */ private static void parserProductDetail(String pId) throws Exception { String pUrl = "; + pId + ".html"; HttpGet httpGet = new HttpGet(pUrl); CloseableHttpClient detailHttpClient = HttpClients.createDefault(); CloseableHttpResponse detailRes = detailHttpClient.execute(httpGet); if (200 == detailRes.getStatusLine().getStatusCode()) { String detailHtml = EntityUtils.toString(detailRes.getEntity(), Charset.forName("utf-8")); // 解析文档 Document detailDoc = Jsoup.parse(detailHtml); // 一次解析出我们想要的数据 Product product = getProductInfo(detailDoc); product.setId(pId); product.setUrl(pUrl); // 补全价格信息 // 1)指定url,2)封装httpget请求 3)发起期请求 4) 得到值 String priceUrl = "; + pId; HttpGet priceHttpGet = new HttpGet(priceUrl); CloseableHttpClient priceHttpClient = HttpClients.createDefault(); CloseableHttpResponse priceRes = priceHttpClient.execute(priceHttpGet); if (200 == priceRes.getStatusLine().getStatusCode()) { String priceJson = EntityUtils.toString(priceRes.getEntity(), Charset.forName("utf-8")); // [{"op":"1999.00","m":"3000.00","id":"J_3367822","p":"1999.00"}] // Gson 谷歌提欧专用于解析json,将json串转化成一个对象。 // 使用必须导入pom依赖。 Gson gson = new Gson(); ArrayList<Map> resultList = gson.fromJson(priceJson, ArrayList.class); Map<String, String> map = (Map<String, String>) resultList.get(0); // 获取价格数据 String price = map.get("op"); product.setPrice(price); } //todo: 将解析出来的数据,保存到数据库。 } } private static Product getProductInfo(Document detailDoc) { Product product = new Product(); // 获取商品名称 String name = detailDoc.select("[class=parameter2 p-parameter-list] li").get(0).text(); product.setName(name); // 获取标题 String title = detailDoc.select(".sku-name").get(0).text(); product.setTitle(title); return product; }}
案例二:定期批量给景点生成静态化页面
//线程工具类public class ThreadUtils { private static final ExecutorService pool = Executors.newFixedThreadPool(10); public static void execute(Runnable runnable) { pool.submit(runnable); }}
@Servicepublic class SceneryPageService { @Autowired private SceneryService sceneryService; @Autowired private TemplateEngine templateEngine; /** * 创建html页面,并写磁盘 */ public void createHtml(Long spuId) { PrintWriter writer = null; try { // 获取景点页面数据信息 Map<String, Object> data = sceneryService.findSceneryById(id); Context context = new Context(); // 将模型数据放入上下文对象 context.setVariables(data); // 文件输出流 File file = new File(path); writer = new PrintWriter(file); //生成静态化页面 templateEngine.process("goods", context, writer); } catch (Exception e) { } finally { if (writer != null) { writer.close(); } } } /** * 使用多线程处理静态页面生成与磁盘写操作 * @param spuId */ public void asyncExcute(Long id) { ThreadUtils.execute(()->createHtml(id)); }}
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #java线程项目