刨根问底--技术--多线程
cookqq ›博客列表 ›struts源码分析

刨根问底--技术--多线程

2013-01-22 19:48:10.0|分类: struts源码分析|浏览量: 1400

摘要: 抓取数据只靠一个单独的线程来工作,速度很慢,如果多开起几个线程速度是不是是原来的几倍呢?这个不用回答了。   1、创建线程可以继承Thread类和实现接口Runnable,2种方式。 2、现在就看看具体怎么在项目中运用...

抓取数据只靠一个单独的线程来工作,速度很慢,如果多开起几个线程速度是不是是原来的几倍呢?这个不用回答了。

 

1、创建线程可以继承Thread类和实现接口Runnable,2种方式。

2、现在就看看具体怎么在项目中运用到的。首先看看线程类ManyThread 的实现:

package com.xing.thread;

import com.xing.action.crawl.SpecialtyAction;

public class ManyThread extends Thread {
	@Override
	public void run() {
		while(TestThread.urlList.size()>0){
			try {
				String url = TestThread.getOneUrl();
				System.out.println("Thread " + Thread.currentThread().getName() + " prints :" +url);
				SpecialtyAction specialtyAction = new SpecialtyAction();
				SpecialtyAction.init();
				String baseUrl ="http://gkcx.eol.cn/";
				specialtyAction.collegeSpecialty(url, baseUrl);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
	}

}

注释:(1)通过继承Thread创建线程。

(2)重写线程类的run()方法,这里主要是你的业务逻辑。

(3)TestThread.getOneUrl()获得要抓取的url地址,这里采用了synchronized关键字,因为多个线程同时获取url,可能线程不同步问题。

(4)后面都是具体抓取业务的逻辑代码。

 

3、测试类TestThread的实现:

package com.xing.thread;

import java.util.ArrayList;
import java.util.List;

public class TestThread {
	
	public static List<String> urlList = new ArrayList<String>();
	public static void init(List<String> listUrl) {
		if(listUrl==null){
			return ;
		}
		for (int i = 0; i < listUrl.size(); i++) {
			urlList.add(listUrl.get(i));
		}
	}
	
	synchronized public static String getOneUrl() {
		if (urlList.size() > 0)
			return (String) urlList.remove(0);
		else
			return null;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		for(int i=550 ;i<650;i++){
			list.add("http://gkcx.eol.cn/schoolhtm/schoolSpecailtyMark/"+i+"/schoolSpecailtyMark.htm");
		}
		init(list);
		for (int i = 0; i < 10 ; i++) {
			Thread t = new ManyThread();
			t.start();
		}
		System.out.println("----------------------------------------------------");
	}
}

注释:(1)定义了静态变量urlList ,用来保存将要抓取的url。

(2)init()方法主要是向urlList 中添加url。

(3)getOneUrl()方法获取urlList 第一个url对象,并且在urlList 中移除这个对象,是为了下次能获取到新的url。

(4)main()方法测试逻辑代码,new ArrayList<String>()对象,并且向其中添加url地址,调用init()初始化urlList中的数据,开启十个线程,并且启动每个线程。

 

Ok!到这里多线程就搞完了,可以测试一下。




一键分享文章

分类列表

  • • struts源码分析
  • • flink
  • • struts
  • • redis
  • • kafka
  • • ubuntu
  • • zookeeper
  • • hadoop
  • • activiti
  • • linux
  • • 成长
  • • NIO
  • • 关键词提取
  • • mysql
  • • android studio
  • • zabbix
  • • 云计算
  • • mahout
  • • jmeter
  • • hive
  • • ActiveMQ
  • • lucene
  • • MongoDB
  • • netty
  • • flume
  • • 我遇到的问题
  • • GRUB
  • • nginx
  • • 大家好的文章
  • • android
  • • tomcat
  • • Python
  • • luke
  • • android源码编译
  • • 安全
  • • MPAndroidChart
  • • swing
  • • POI
  • • powerdesigner
  • • jquery
  • • html
  • • java
  • • eclipse
  • • shell
  • • jvm
  • • highcharts
  • • 设计模式
  • • 列式数据库
  • • spring cloud
  • • docker+node.js+zookeeper构建微服务
版权所有 cookqq 感谢访问 支持开源 京ICP备15030920号
CopyRight 2015-2018 cookqq.com All Right Reserved.