java简单实现多线程及线程池实例详解
作者:shao-hang 发布时间:2023-05-12 05:47:04
标签: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();
}
}
}
来源:https://blog.csdn.net/William_hangshao/article/details/67644335


猜你喜欢
- 前言最近我在项目写了几万行代码,小伙伴担心会让程序启动速度变慢,所以本渣就来做测试。 本渣使用了代码创建器,创建了 1000 个垃圾文件,这
- 对这种懒加载问题,最后的做法是利用Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibern
- 一、Intent的用途Intent主要有以下几种重要用途: 1. 启动Activity:可以将Intent对象传递给startActivit
- 抽象类什么是抽象类呢?在现实生活中,我们说“人类”,我们无法对应到具体某个人,同样的,&ld
- 事件基于委托,可以为任何一种委托类型提供一种发布\订阅机制。使用event关键字将一个委托类型定义为事件。下面通过一个例子介绍事件://事件
- Bean是Spring框架中最核心的两个概念之一(另一个是面向切面编程AOP)。1 定义Spring 官方文档对 bean 的解释是:In
- 对于Android View的测量,我们一句话总结为:
- 之前看过一句话,说的特别好。有人问阅读源码有什么用?学习别人实现某个功能的设计思路,提高自己的编程水平。是的,大家都实现一个功能,不同的人有
- 在之前文章的铺垫下,再为大家分享一篇:Android手势密码,附源码下载,不要错过。源码下载:http://xiazai.jb51.net/
- android开发中有时候碰到切换语言的需求,这时候需要通过代码动态改变当前运行语言。package com.example.android
- 前言最近在维护一个运营端的系统,和前端联调的过程中,经常需要排查一些交互上的问题,每次都得看前端代码的传参和后端代码的出参,于是打算给HTT
- 工欲善其事,必先利其器很多程序员可能都忘了记录应用程序的行为是一件多么重要的事,当遇到多线程环境下高压力导致的并发bug时,你就能体会到记录
- 泛型1、简单泛型泛型的主要目的之一就是用来指定容器要持有什么类型的对象,而且由编译器来保证类型的正确性。泛型暂时不指定类型,在使用时决定具体
- 首先创建一个工具类import android.annotation.TargetApi;import android.app.Activi
- 例子一,获取三小时前的记录public static DataTable Query(){const string sSql = "
- DropDownList控件又称下拉列表框控件, 控件 列表 中的多行数 据 以隐含 的形式表 示 出 来,当用户需要选择所需列表项时,通过
- 前言在工作中有遇到这样的需求,需要把hmtl的富文本内容,进行深色模式适配。原先的富文本内容是在直接在webview上进行展示。解决思路:替
- 本文实例讲述了java读取properties配置文件的方法。分享给大家供大家参考。具体分析如下:这两天做java项目,用到属性文件,到网上
- Spring流程Debug1.1 Spring测试环境搭建Spring模块概览,绿色是模块,Spring中八大模块,黑色表示该模块包含的ja
- 本文实例讲述了Android开发实现判断通知栏是否打开及前往设置页面的方法。分享给大家供大家参考,具体如下:项目中用到日程提醒功能,如果应用