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();
    }
  } 

}

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

您可能感兴趣的文章:

  • java编写属于自己的线程池
  • Java手写线程池的实现方法
  • Java并发之串行线程池实例解析
  • Java ExecutorService四种线程池使用详解
  • Java线程池FutureTask实现原理详解
  • java线程池工作队列饱和策略代码示例
  • 深入理解Java编程线程池的实现原理
  • Java线程池使用与原理详解
  • java多线程学习笔记之自定义线程池
  • Java实现终止线程池中正在运行的定时任务
(0)

相关推荐

  • 深入理解Java编程线程池的实现原理

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果.今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法讲起,

  • Java并发之串行线程池实例解析

    前言 做Android的这两年时间,通过研究Android源码,也会Java并发处理多线程有了自己的一些理解. 那么问题来了,如何实现一个串行的线程池呢? 思路 何为串行线程池呢? 也就是说,我们的Runnable对象应该有个排队的机制,它们顺序从队列尾部进入,并且从队列头部选择Runnable进行执行. 既然我们有了思路,那我们就考虑一下所需要的数据结构? 既然是从队列尾部插入Runnable对象,从队列头部执行Runnable对象,我们自然需要一个队列.Java的SDK已经给我们提供了很好的

  • Java ExecutorService四种线程池使用详解

    1.引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要的等到线程创建就能立即执行.第三:提高线程的可管理性.线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控.但是要做到合理的利用线程池,必须对其原理了如指掌. 2.线程池使用 Executors提供的四种线程 1.newCachedThreadPool创建一个可缓存线程池

  • Java线程池使用与原理详解

    线程池是什么? 我们可以利用java很容易创建一个新线程,同时操作系统创建一个线程也是一笔不小的开销.所以基于线程的复用,就提出了线程池的概念,我们使用线程池创建出若干个线程,执行完一个任务后,该线程会存在一段时间(用户可以设定空闲线程的存活时间,后面会介绍),等到新任务来的时候就直接复用这个空闲线程,这样就省去了创建.销毁线程损耗.当然空闲线程也会是一种资源的浪费(所有才有空闲线程存活时间的限制),但总比频繁的创建销毁线程好太多. 下面是我的测试代码 /* * @TODO 线程池测试 */ @

  • Java线程池FutureTask实现原理详解

    前言 线程池可以并发执行多个任务,有些时候,我们可能想要跟踪任务的执行结果,甚至在一定时间内,如果任务没有执行完成,我们可能还想要取消任务的执行,为了支持这一特性,ThreadPoolExecutor提供了 FutureTask 用于追踪任务的执行和取消.本篇介绍FutureTask的实现原理. 类视图 为了更好的理解FutureTask的实现原理,这里先提供几个重要接口和类的结构,如下图所示: RunnableAdapter ThreadPoolExecutor提供了submit接口用于提交任

  • java线程池工作队列饱和策略代码示例

    线程池(Thread Pool) 是并行执行任务收集的实用工具.随着 CPU 引入适合于应用程序并行化的多核体系结构,线程池的作用正日益显现.通过 ThreadPoolExecutor类及其他辅助类,Java 5 引入了这一框架,作为新的并发支持部分. ThreadPoolExecutor框架灵活且功能强大,它支持特定于用户的配置并提供了相关的挂钩(hook)和饱和策略来处理满队列 Java线程池会将提交的任务先置于工作队列中,在从工作队列中获取(SynchronousQueue直接由生产者提交

  • Java手写线程池的实现方法

    本文实例为大家分享了Java手写线程池的实现代码,供大家参考,具体内容如下 1.线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程. 2.线程池简易架构 3.简易线程池代码(自行优化) import java.util.List; /** * 线程接口 * * @Author yjian * @Date 14:49 2017/10/14 **/ public interface IThreadPool { //加入任务 void ex

  • java编写属于自己的线程池

    什么是线程池 线程池就是以一个或多个线程[循环执行]多个应用逻辑的线程集合. 一般而言,线程池有以下几个部分: 完成主要任务的一个或多个线程. 用于调度管理的管理线程. 要求执行的任务队列. 线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量,其他线程排队等候.一个任务执行完毕,再从队列的中取最前面的任务开始执行.若队列中没有等待进程,线程池的这一资源处于

  • Java实现终止线程池中正在运行的定时任务

    最近项目中遇到了一个新的需求,就是实现一个可以动态添加定时任务的功能.说到这里,有人可能会说简单啊,使用quartz就好了,简单粗暴.然而quartz框架太重了,小项目根本不好操作啊.当然,也有人会说,jdk提供了timer的接口啊,完全够用啊.但是我们项目的需求完全是多线程的模型啊,而timer是单线程的,so,楼主最后还是选择了jdk的线程池. 线程池是什么 Java通过Executors提供四种线程池,分别为: newCachedThreadPool :创建一个可缓存线程池,如果线程池长度

  • java多线程学习笔记之自定义线程池

    当我们使用 线程池的时候,可以使用 newCachedThreadPool()或者 newFixedThreadPool(int)等方法,其实我们深入到这些方法里面,就可以看到它们的是实现方式是这样的. public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueu

随机推荐