java多线程采集+线程同步

做大数据项目必须用到多线程,从网上找了个例子,很好,故记录下来以备参考

源代码如下:

1、线程类

package com.yjf.util;  
import java.util.Date;  
import java.util.List;  
  
  
public class GetWebThread extends Thread{  
      
    /** 
     * 线程 
     */  
    public void run(){  
        try {  
            while (true) {  
                int day = 0;  
                long time1 = new Date().getTime();  
                //用来同步抓取线程  
                synchronized("searchthead"){  
                    Main.thisdaycount++;  
                    if(Main.thisdaycount>Main.daycount){  
                        break;  
                    }  
                    System.out.println("开始查询第"+(Main.thisdaycount)+"天");  
                    Thread.sleep(133);  
                    day = Main.thisdaycount-1;  
                }  
                //获取抓取的时间  
                String datetext = TimeUtil.date.format(TimeUtil.addDaysForDate(day));  
                String[] txt =FileUtil.getCityByTxtFile();  
                for(int t=0;t<txt.length;t++){  
  
                    String[] way = txt[t].split("\\|");  
                    String start = way[0];  
                    String end = way[1];  
                    //抓取到的数据列表  
                    List<DataBean> datalist = Main.getDataList(datetext, start, end);  
                    if(datalist!=null){  
                        Main.isadsl = 0;  
                        CheckAdsl.adsllasttime = new Date().getTime();  
                        FileUtil.addDataToFileCsv(datalist);  
                        Main.log.printLog("===="+datetext+"="+start+"="+end+"="+t+"=数据总数:"+datalist.size());  
                    }else{  
                            Thread.sleep(11);  
                            AdslThead.isadsl = true;  
                            Thread.sleep(11);  
                            //判断是否正在拨号 并暂停线程  
                            while (AdslThead.isadsl) {  
                                Thread.sleep(5000);  
                            }  
                        t--;  
                    }  
                }  
                long time2 = new Date().getTime();  
                Main.log.printLog(datetext+"==查询完毕=========耗时"+(time2-time1));  
            }  
        } catch (Exception e) {  
            Main.log.printLog(e.getMessage());  
            e.printStackTrace();  
        }  
    }  
      
}  

第二步,启动线程,准备线程数量

2、线程启动类,包括启动,控制,停止

package com.yjf.util;  
  
import java.io.BufferedInputStream;  
import java.io.FileInputStream;  
import java.io.InputStream;  
import java.util.ArrayList;  
import java.util.Date;  
import java.util.List;  
import java.util.Properties;  
import java.util.Timer;  
  
  
public class Main {  
    private static boolean isRunGrabThread = true;     //抓取线程是否执行完毕  
    public static int threadCount = 3;   //线程数量  
    public static int daycount = 30;         //查询总天数  
    public static int thisdaycount = 0;  
    public static int isadsl = 0;  
    public static int adslcount = 1;  
      
      
        public static void main(String[] args) {  
            try {  
                  
                startThead();//启动抓取数据主线程  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
          
          
        public static void startThead(){  
            Thread[] grabThreads= new Thread[threadCount];    
            try{            
                //开启-数据抓取子线程  
                for(int i=0;i<grabThreads.length;i++){  
                    Thread searchThread=new GetWebThread();  
                    grabThreads[i] = searchThread;  
                    grabThreads[i].setDaemon(true);  
                    grabThreads[i].start();  
                }  
                  
                isRunGrabThread = true;  
                  
                //监控子线程,全部完成程序退出  
                WhileLoop:                                
                      
                while(true){  
                      
                    //拨号策略控制  
                    //reconnectControl();     
                      
                    //判断子线程是否运行完成  
                    for(int i=0;i<threadCount;i++){  
                        if(grabThreads[i].isAlive()){  
                            Thread.sleep(3*1000);  
                            continue WhileLoop;  
                        }  
                    }  
  
                    //所有抓取线程执行完毕  
                    isRunGrabThread = false;  
                      
                    //子线程执行完毕则退出  
                    break;  
                }  
            }  
            catch (Exception e) {  
                System.out.println("main主线程--系统异常!");  
            }  
        }  
          
          
  
}  






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值