龙空技术网

公司项目java多线程一般用在哪些场景?练手demo推荐

扣丁学堂 351

前言:

眼前咱们对“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线程项目