java简单实现多线程及线程池实例详解

 更新时间:2018年03月23日 09:35:47   作者:shao-hang  
这篇文章主要为大家详细介绍了java简单实现多线程,及java爬虫使用线程池实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文为大家分享了java多线程的简单实现及线程池实例,供大家参考,具体内容如下

一、多线程的两种实现方式

1、继承Thread类的多线程

/** 
 * 继承Thread类的多线程简单实现 
 */ 
public class extThread extends Thread { 
    
   public void run(){ 
      for(int i=0;i<100;i++){ 
        System.out.println(getName()+"-"+i); 
      } 
   } 
    
   public static void main(String arg[]){ 
      for(int i=0;i<100;i++){ 
        System.out.println(Thread.currentThread().getName()+"-"+i); 
        if(i==50){ 
           new extThread().start(); 
           new extThread().start(); 
        } 
      } 
   } 
} 

2、实现Runnable接口的多线程

/** 
 * 实现runable接口的多线程实例 
 */ 
public class runThread implements Runnable { 
   public void run(){ 
      for(int i=0;i<100;i++){ 
        System.out.println(Thread.currentThread().getName()+"-"+i); 
      } 
   } 
    
   public static void main(String arg[]){ 
      for(int i=0;i<100;i++){ 
        System.out.println(Thread.currentThread().getName()+"-"+i); 
        if(i==50){ 
           runThread rt = new runThread(); 
           new Thread(rt,"新线程1").start(); 
           new Thread(rt,"新线程2").start(); 
        } 
      } 
   } 
    
} 

二、线程池的简单实现

//实现Runnable接口 
class TestThread implements Runnable{ 
   
  public void run() { 
    for(int i = 0;i < 100;i++){ 
      System.out.println(Thread.currentThread().getName() + "i的值为:" + i); 
    } 
  } 
} 
 
public class threadPoolTest { 
   
  public static void main(String[] args) { 
    //创建一个具有固定线程数的线程池 
    ExecutorService pool = Executors.newFixedThreadPool(5); 
    //向线程池中提交三个线程 
    pool.submit(new TestThread()); 
    pool.submit(new TestThread()); 
    pool.submit(new TestThread()); 
    //关闭线程池 
    pool.shutdown(); 
  } 
 
} 

三、java爬虫使用线程池实例

/** 
 * 爬虫调度线程池 
 */ 
public class threadPool { 
 
  public static HashMap<String, Spiders> statusMap = new HashMap<String, Spiders>(); 
  // 存放爬虫,key为爬虫的id,value为爬虫的线程池 
  static HashMap<Integer, ThreadPoolExecutor> threadMap = new HashMap<Integer, ThreadPoolExecutor>(); 
  //创建一个线程池 
  static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(200, 230,80000L,  
      TimeUnit.SECONDS,  
      new ArrayBlockingQueue<Runnable>(10), 
      new ThreadPoolExecutor.CallerRunsPolicy()); 
 
  public static void executeThread(Spiders spider) { 
    statusMap.put(String.valueOf(spider.getId()), spider); 
    // 爬虫有效 
    if (spider.getFlag() == 0) { 
      if (spider.getStatus() == 0) { 
        // 表示爬虫进入抓取状态 
        ThreadPoolExecutor detailPool = null; 
        if (threadMap.get(spider.getId()) == null) { 
          detailPool = new ThreadPoolExecutor(30, 80, 80000L, 
              TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>( 
                  10), 
              new ThreadPoolExecutor.CallerRunsPolicy()); 
          threadMap.put(spider.getId(), detailPool); 
          threadPool.execute(new threadRun(spider, threadMap)); 
        } 
      } 
    } 
  } 
} 
 
//实现Runnable接口 
class threadRun implements Runnable { 
 
  private HashMap<Integer, ThreadPoolExecutor> threadPoolMap; 
  private Spiders spider; 
 
  public threadRun(Spiders spider, 
      HashMap<Integer, ThreadPoolExecutor> threadPoolMap) { 
    this.threadPoolMap = threadPoolMap; 
    this.spider = spider; 
  } 
 
  //线程执行体 
  public void run() { 
    try { 
      if ("rong360".equals(spider.getWebsite())) { 
        new RongThread(threadPoolMap.get(spider.getId()), spider) 
            .startSpider(); 
      } else if ("xxgg_sd".equals(spider.getWebsite())) { 
        new Spider_ShanDong(threadPoolMap.get(spider 
            .getId()), spider).startSpider(); 
      } else if ("xxgg_gz".equals(spider.getWebsite())) { 
        new Spider_GuiZhou(threadPoolMap.get(spider 
            .getId()), spider).startSpider(); 
      } else if ("sx".equals(spider.getWebsite())) { 
        new SpiderSX(spider).startSpider(); 
      } else if ("baidu".equals(spider.getWebsite())) { 
        new SpiderBaiDu(spider).startSpider(); 
      } else if ("11315".equals(spider.getWebsite())) { 
        new Spider11315ByName(spider).startSpider(); 
      }  
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring Web MVC框架学习之配置Spring Web MVC

    Spring Web MVC框架学习之配置Spring Web MVC

    这一篇文章讲的是Spring Web MVC各部分的配置方法,包括Java代码配置和XML文件配置以及MVC命名空间的使用方法。
    2017-03-03
  • java的基本数据类型及属性

    java的基本数据类型及属性

    java的基本数据类型及属性,需要的朋友可以可以参考一下
    2013-03-03
  • Kotlin中let、run、with、apply及also的用法和差别

    Kotlin中let、run、with、apply及also的用法和差别

    作用域函数是Kotlin比较重要的一个特性,分为5种let、run、with、apply及also,这五个函数的工作方式非常相似,但是我们需要了解这5种函数的差异,以便在不同的场景更好的利用它,这篇文章主要介绍了Kotlin中let、run、with、apply及also的差别,需要的朋友可以参考下
    2023-11-11
  • Springboot配置文件内容加密代码实例

    Springboot配置文件内容加密代码实例

    这篇文章主要介绍了Springboot配置文件内容加密代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • SpringSecurity在SpringBoot中的自动装配过程

    SpringSecurity在SpringBoot中的自动装配过程

    这篇文章主要介绍了SpringSecurity在SpringBoot中的自动装配过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java多线程实现之Executor详解

    Java多线程实现之Executor详解

    这篇文章主要介绍了Java多线程实现之Executor详解,Executor 给他一个 Runnable,他就能自动很安全的帮你把这个线程执行完毕
    Executor 通过创建线程池的方式来管理线程,需要的朋友可以参考下
    2023-08-08
  • Java如何随机生成图片验证码

    Java如何随机生成图片验证码

    这篇文章主要为大家详细介绍了Java如何随机生成图片验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • springBoot整合RocketMQ及坑的示例代码

    springBoot整合RocketMQ及坑的示例代码

    这篇文章主要介绍了springBoot整合RocketMQ及坑的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • 解决 IDEA Maven 项目中"Could not find artifact" 问题的常见情况和解决方案

    解决 IDEA Maven 项目中"Could not find artifact" 

    这篇文章主要介绍了解决IDEA Maven项目中Could not find artifact问题的常见情况和解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 详解SpringMVC @RequestBody接收Json对象字符串

    详解SpringMVC @RequestBody接收Json对象字符串

    这篇文章主要介绍了详解SpringMVC @RequestBody接收Json对象字符串,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01

最新评论