python爬虫_django+vue+echarts可视化查询所有CSDN用户质量分

news2024/11/25 12:47:23

文章目录

    • ⭐前言
      • ⭐ 效果
      • ⭐django简介
      • ⭐vue3简介
      • ⭐vue引入echarts
    • ⭐前后分离实现
    • 💖 django代码层
    • 💖 vue3代码层
    • 结束

⭐前言

大家好,我是yma16,本文分享关于前后分离django+vue+echarts可视化查询CSDN用户质量分。
该系列文章:
python爬虫_基本数据类型
python爬虫_函数的使用
python爬虫_requests的使用
python爬虫_selenuim可视化质量分

⭐ 效果

项目部署在inscode上:https://yma16.inscode.cc/
表格展示文章评分
score-table
echarts图表点击可跳转博文:
echarts-article

gif演示:
git-show

⭐django简介

Django是一个开源Python web框架,由Django Software Foundation负责维护。它采用了“MTV”(模型、模板、视图)的设计架构,以使代码的复用、维护和可扩展性更加容易。Django包括许多内置的功能,如ORM(对象关系映射),表单处理,会话管理和身份验证等。它还支持许多插件和扩展,如REST框架和CMS(内容管理系统)。Django被广泛应用于构建高度可伸缩的Web应用程序,包括社交网络、博客、电子商务应用程序等。

⭐vue3简介

Vue3是最新版本的Vue.js框架,是Vue.js的第三个主要版本。Vue3兼容Vue2,并且进行了几个重要的改进。最大的改进是对组合API的引入,组合API可以让开发者更轻松地抽象出可复用的逻辑,提高代码的组合性和可重用性。Vue3还引入了更快速的虚拟DOM和编译器,带来更快的渲染速度和更小的应用程序大小。另外,Vue3还提供了更好的TypeScript支持,使得开发者更容易编写类型安全的代码。总之,Vue3是一个更加强大和灵活的框架,具有更好的性能和更好的开发体验。

⭐vue引入echarts

要在Vue中使用Echarts,需要先安装Echarts:

npm install echarts --save

然后,在Vue3中引入Echarts:

import * as echarts from 'echarts'

export default {
  name: 'MyChart',
  data() {
    return {
      chartInstance: null,
    }
  },
  mounted() {
    this.initChart()
  },
  methods: {
     function initChart() {
      // 获取容器元素
      const container = this.$refs.chartContainer

      // 初始化Echarts实例
      this.chartInstance = echarts.init(container)

      // 设置图表配置项
      const option = {...}

      // 渲染图表
      this.chartInstance.setOption(option)
    }
  },
}

在模板中,需要添加一个容器元素来容纳图表:

<template>
  <div ref="chartContainer" style="width: 100%; height: 400px;"></div>
</template>

这样就可以在Vue3中使用Echarts了。如果需要使用Vue3的Composition API来管理图表逻辑,可以将上面的代码封装成一个自定义Hook来重用。

⭐前后分离实现

思路:
后端:django抓取用户的接口数据暴露
前端: vue3+antd调用接口数据实现可视化用户质量分

💖 django代码层

view视图代码:

from django.http import JsonResponse
import openai,requests,json
import js2py
import json
# CSDN个人博文质量查询
import requests
from requests_toolbelt import MultipartEncoder

# 获取文章列表
def get_post_list_urls(page, username):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0"
    }
    lb_params = {
        "page": page,
        "size": "20",
        "businessType": "blog",
        "orderby": "",
        "noMore": "false",
        "year": "",
        "month": "",
        "username": username,
    }
    urls = "https://blog.csdn.net/community/home-api/v1/get-business-list"
    try:
        res = requests.get(url=urls, headers=headers, params=lb_params)
        data_list = res.json()["data"]["list"]
        return data_list
    except Exception as e:
        print('page error', str(e))
        return 0

# 查询质量分数
def get_sorce(article_url):
    url = "https://bizapi.csdn.net/trends/api/v1/get-article-score"

    headers = {

        "accept": "application/json, text/plain, */*",
        "accept-encoding": "gzip, deflate, br",
        "accept-language": "zh-CN,zh;q=0.9",
        "content-length": "218",
        "content-type": "multipart/form-data; boundary=----WebKitFormBoundarymKS9dpHZYkkMHZWj",
        "cookie": "uuid_tt_dd=10_37086218120-1683187755910-896626; __bid_n=187e5d0cbaf89d1f724207; __gads=ID=3fcd1ab266c84bd9-220bdd6894e0004c:T=1683187762:RT=1683187762:S=ALNI_MbszTpjyvTAnMd5pG5eE3Ol6jpbVw; __gpi=UID=00000c0178601530:T=1683187762:RT=1683857695:S=ALNI_Mb7KrJygTsLQRFePHRA1tpMIbjBqA; UserName=u014727709; UserInfo=836a27b06b334117be2e4e851dd7733c; UserToken=836a27b06b334117be2e4e851dd7733c; UserNick=%E6%83%B3%E4%BD%A0%E4%BE%9D%E7%84%B6%E5%BF%83%E7%97%9B; AU=794; UN=u014727709; BT=1683860533258; p_uid=U010000; Hm_up_6bcd52f51e9b3dce32bec4a3997715ac=%7B%22islogin%22%3A%7B%22value%22%3A%221%22%2C%22scope%22%3A1%7D%2C%22isonline%22%3A%7B%22value%22%3A%221%22%2C%22scope%22%3A1%7D%2C%22isvip%22%3A%7B%22value%22%3A%220%22%2C%22scope%22%3A1%7D%2C%22uid_%22%3A%7B%22value%22%3A%22u014727709%22%2C%22scope%22%3A1%7D%7D; FPTOKEN=KFhOagH01mR+lE0zk/9/4AZwdybQP4pJ9q4URSqGTcW3XgmQAKRP4XtCWpwF+xPBRetpgJyJFG2D0s49i9WhPT9JgHOJHov85Eg6St4WHj3G1zbPbra/SUcnnYPxRE0NO8mKry4LEVT/QetTZ24R3KXbnEX3agAt6UFFWLVFgBb62Ay1YlJtNXrFkIVbk5AeVNR9Bx6M8d8k9s2FmAAE44V1cRUjFunOpnmtwhHvH+CUoBgMptgWVDxl110YHcOm3auS61uCROqlmB/TWa1/wBOjoOVw9weCASapZAIB0D+Jth2cPKzPsDEQMBRVsFqlaCb1dRjByej6jwzW8JKkotUxHVnhG2ad2Sl2zMGgbP3LtwOocyYbd7aaccpYiIj/ICbWPhQpBi6bfOau6eenzQ==|Ux1hTZK4ogvPMjCnvaBGyetqQq0EbCbGSZMQzvU1HfI=|10|338abfb0d23c89b679ee1ded400a352b; ssxmod_itna=Yq+h7I4AxjxG2xlbr+eKD5KdxgGC0j7/jDBwDAIYDZDiqAPGhDC34FxT80OYcxqGkQZMGpNlixnx3mQVC7Yu1rDCPGnDBF+orDee=D5xGoDPxDeDABPiTDYSQDEDeKDRDWKGyR3NcOP5B0OU1PDR15DwxD15BIxvxG1DQ5Dsp4p44DCazEqDm+ohpHzDCKDj1yODmWFY4GdrQG4IYkeMYRD=E053mb37CG4TCi3qenDkYr4QDBD4abPbe=DirGqaQGP4D===; ssxmod_itna2=Yq+h7I4AxjxG2xlbr+eKD5KdxgGC0j7/D8LCBkDGNGk81DFEiIAZ0OPApwX74QV7jqi=qI1BHL+oNii72w58ECv4+2ten9UQ27AD3XG3bRpyrPhXjkDwjXNHYMuuDv6zAt45ojzEtWguOWZHHVYIOaEqFRC0x5FqGoawzo6HaR07F3j+=2jyGqrW7SA0FdP4AfWpxx6H46tGIYiPkKicz3n5G/Z8OVn0tjfcQeWWiu39DoPHXZZqKMCg8e6+IIEyDXRG6YCjtb6lQ2Y=IZxOB2GPkfutGLcvz2Z/0uWwgoHvcSby+/pPg6qDSmVrp+Ov0GwVZKGcUBBjxKqkEvv7IzrtUleOn+4BE7WqYgqQ2KpEw6QmKD34QApn+b=Dz64KlmZWXFlfdDpNiLSODjetWgE7PUFSETx33n3PG=WSExWf5c3+DWwe6E6hsCeQnwxSGGedenIzlPumU7bpt/NQYqPYfxt5yCaTZKk2N4Yqo6+Iapx0UdSEy7TAYyicHsAHF/PADusie0EuZBn0EEyzbix7Q1tFjEduvE=ba9tQWTLt8xunPpSZWvvxfYR8ir2Lxf7IEa/93HpKmmwimHj+OcY5H4DQ9U82i0kFGD1YuDbUvj7u1bi005D08DiQ5YD=; log_Id_view=5351; c_dl_fref=https://blog.csdn.net/qq_45157635/article/details/131064971; c_dl_prid=1687150160923_424595; c_dl_rid=1687150175427_591440; c_dl_fpage=/download/qq_47632786/85622911; c_dl_um=distribute.pc_relevant.none-task-download-2%7Edefault%7ECTRLIST%7EAntiPaid-3-87472365-blog-131064971.235%5Ev38%5Epc_relevant_default_base3; c_utm_source=1966961068; c_first_ref=default; c_segment=2; dc_sid=1b9e8213caa5348d865241cd9435a5e9; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1687824698,1687911255,1687956527,1687997637; firstDie=1; dc_session_id=10_1688013171909.840541; c_page_id=default; log_Id_click=1268; c_pref=default; c_ref=default; c_first_page=https%3A//www.csdn.net/qc%3Futm_source%3D1966961068; c_dsid=11_1688015643395.788238; utm_source=1966961068; log_Id_pv=1605; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1688015644; dc_tos=rx017i",
        "origin": "https://www.csdn.net",
        "referer": "https://www.csdn.net/qc?utm_source=1966961068",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "same-site",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
        "x-ca-key": "203930474",
        "x-ca-nonce": "c604c7f2-88ec-4cbf-aa7c-3aec9803c515",
        "x-ca-signature": "AzzRQ6mYf0LscPig+ksIdjHUNjlA7T3WGEdx08cS96U=",
        "x-ca-signature-headers": "x-ca-key,x-ca-nonce",
        "x-ca-signed-content-type": "multipart/form-data"
    }
    params = MultipartEncoder({"url": article_url})
    headers["Content-Type"] = params.content_type
    try:
        res = requests.post(url=url, headers=headers, data=params, timeout=10,)
        sorce = res.json()["data"]
        return sorce
    except Exception as e:
        print('grade error',str(e))
        return 0

def serachCsdnUserArticleInfo(username):
    try:
        res = []
        page = 1
        while True:
            data_list = get_post_list_urls(page, username)
            page += 1
            if data_list == 0 or len(data_list) == 0:
                break
            else:
                res += data_list
        data_array = []
        for data in res:

            article_url = data["url"]
            grade_dict = get_sorce(article_url)
            article_title=data['title']
            article_vieCount=data['viewCount']
            article_commentCount=data['commentCount']
            article_collectCount=data['collectCount']
            article_postTime=data['postTime']
            grade_message=grade_dict['message']
            grade_score=grade_dict['score']
            data_array.append({
                'title':article_title,
                'url':article_url,
                'viewCount':article_vieCount,
                'commentCount':article_commentCount,
                'collectCount':article_collectCount,
                'message':grade_message,
                'score':grade_score,
                'postTime':article_postTime
            })
        return data_array
    except Exception as e:
        print('username error', str(e))

urls路由的代码:

from django.contrib import admin
from .views import getCsdnGrade
from django.urls import path,include

urlpatterns = [
    path(r'getCsdnGrade/', getCsdnGrade),
]

💖 vue3代码层

前端代码层:

<script setup>
import axios from 'axios';
import * as echarts from 'echarts';

import { onMounted, reactive, onUnmounted } from 'vue';
const state = reactive({
  loading: false,
  searchValue: 'qq_38870145',
  firstChart: null,
  columns: [{
    title: '文章名称',
    dataIndex: 'title',
    fixed:true
  }, {
    title: '链接',
    dataIndex: 'url',
    sorter: true,
  }, {
    title: '浏览量',
    dataIndex: 'viewCount',
    sorter: true,
  }, {
    title: '收藏量',
    dataIndex: 'collectCount',
    sorter: true,
  }, {
    title: '分数',
    dataIndex: 'score',
    sorter: true,
  }, {
    title: '建议',
    dataIndex: 'message',
  }, {
    title: '发文时间',
    dataIndex: 'postTime',
  }],
  dataSource: []
})
const getCsdnData = (uId) => {

  const url = 'https://yongma16.xyz/common-api/getCsdnGrade/'
  const data = {
    uId
  }
  state.loading = true
  axios.post(url, data, { timeout: 100000 }).then(res => {
    state.dataSource = res.data.data
    state.loading = false
    initFirstData()
  }).catch((r) => {
    console.log(r)
    state.loading = false
    state.dataSource = []
    initFirstData()
  })
}
onMounted(() => {
  onSearch()
})
const onSearch = () => {
  if (!state.searchValue) {
    return window.alert('请输入用户id')
  }
  getCsdnData(state.searchValue)
}

function initFirstData() {

  // 基于准备好的dom,初始化echarts实例
  const myChart = echarts.init(document.getElementById('first'));
  const option = {
    title: {
      text: 'csdn 质量分柱状图 点击跳转到对应的文章'
    },
    toolbox: {
      show: true,
      feature: {
        saveAsImage: {}
      }
    },
    dataZoom: [
      {
        id: 'dataZoomX',
        type: 'slider',
        xAxisIndex: [0],
        filterMode: 'filter'
      },
      {
        id: 'dataZoomY',
        type: 'slider',
        yAxisIndex: [0],
        filterMode: 'empty'
      }
    ],
    tooltip: {
      trigger: 'axis',
      axisPointer: {
        type: 'shadow'
      }
    },
    legend: {},
    xAxis: {
      type: 'category',
      data: state.dataSource.map(item => item.postTime)
    },
    yAxis: {
      type: 'value'
    },
    tooltip: {
      formatter: function (params) {
        console.log('params', params)
        const findItem = state.dataSource.find(item => {
          return item.postTime == params.name
        })
        return `<span style='color:blue'>-<span> 博客标题:${params.name}  <br>
                <span style='color:green'>-<span> 博客质量:${params.value} <br>
                <span style='color:red'>-<span> 博客建议:${findItem.message}<br>
                <span style='color:blue'>-<span> 博客地址:${findItem.url}<br>
                    `
      },
    },
    series: [
      {
        data: state.dataSource.map(item => item.score),
        type: 'bar',
        showBackground: true,
        backgroundStyle: {
          color: 'rgba(180, 180, 180, 0.2)'
        },
        label: { //柱体上显示数值
          show: true,//开启显示
          position: 'center',//在上方显示
          textStyle: {//数值样式
            fontSize: '2px',
            color: 'white'
          }
        },
        markPoint: {
          data: [
            { type: 'max', name: '最高分' },
            { type: 'min', name: '最低分' }
          ]
        },
        markLine: {
          data: [{ type: 'average', name: '平均分' }]
        }
      }
    ]
  };
  // 使用刚指定的配置项和数据显示图表。
  myChart.setOption(option);
  // 监听
  state.firstChart = myChart;
  window.onresize = myChart.resize
  myChart.on('click', function (params) {
    const findItem = state.dataSource.find(item => {
      return item.postTime == params.name
    })
    if (params.name) {
      window.open(findItem.src, '_blank')
    }
  });
  onUnmounted(() => {
    window.onresize = null
  })
}
</script>

<template>
  <div class="container">
    <div>
      <a-input-search v-model:value="state.searchValue" :disabled="state.loading" placeholder="输入用户id" enter-button
        @search="onSearch" />
    </div>
    <br>
    <div>
      <a-table :scroll="{ x: 800 }" :columns="state.columns" :data-source="state.dataSource" :loading="state.loading">
      </a-table>
    </div>
    <div>
      <div id="first" style="width:800px;max-height:900px;"></div>
    </div>
  </div>
</template>

<style scoped></style>

inscode代码如下:

搜索用户id查询:
search-uid

结束

本文分享python的自动化获取质量分到此结束!
scene

👍 点赞,是我创作的动力!
⭐️ 收藏,是我努力的方向!
✏️ 评论,是我进步的财富!
💖 感谢你的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一种基于linux内核双向链表的移植

1.简介 双向链表&#xff08;Doubly Linked List&#xff09;是一种常见的数据结构&#xff0c;由一系列的节点组成&#xff0c;每个节点都包含两个指针&#xff0c;分别指向前一个节点和后一个节点。与单向链表不同&#xff0c;双向链表可以在 O(1) 的时间复杂度内向前或向后遍…

【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI解放美术/程序(完结)

工具效果&#xff1a; 第一步&#xff0c;把psd图层转换为可编辑的节点树&#xff0c;并自动解析UI类型、自动绑定UI子元素&#xff1a; 第二步, 点击“生成UIForm"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单手动点选UI类型)&#xff1a; 验证一键生成UI效果: 书接上…

idea双击打不开怎么办?

今天在敲代码的时候&#xff0c;突然出现了一个bug&#xff0c;idea打不开了&#xff0c;这个问题怎么解决&#xff1f; 只要找到C:\Users\Administrator .IntelliJIdea2019.3这个文件把所有文件都给删了就可以重启了 哈哈&#xff0c;重启成功

Bayes贝叶斯定理

问题的关键在于&#xff1a;人们是否考虑过大背景/先验/问题的前提&#xff0c;从而做出一个大致的估计。这就引出了我们关于理性的探讨&#xff0c;理性不是说知道事实&#xff0c;而是认识到哪些因素是有关的。 x.1 一个关于贝叶斯定理的例子 引入一个steve假设。我们已知大…

开源进展 | WeIdentity v3.1.1发布,提供无存储依赖的纯功能接口

作为连接实体对象&#xff08;人或物&#xff09;的现实身份与链上身份的可信映射&#xff0c;实现实体对象之间安全可信的数据授权与交换&#xff0c;分布式身份技术解决方案在推动区块链应用繁荣及可信数据流转的过程中扮演着重要角色。 WeIdentity是由微众银行自主研发并完全…

parcel打包工具搭建热开发项目环境

parcel是一款WEB端打包工具 能够提供热开发的项目环境 使用了的话不然Webpack 但相对搭建项目会更快一些 我们现在本地创建一个目录 然后 用编辑器打开我们创建的目录 运行终端 在终端中输入 npm init 初始化一个项目 运行完毕之后 我们就会得到一个package.json文件 然后…

Spring Boot 中的 RedisCacheManager 是什么,原理,如何使用

Spring Boot 中的 RedisCacheManager 是什么&#xff0c;原理&#xff0c;如何使用 介绍 在现代应用程序中&#xff0c;缓存是提高应用程序性能的重要组成部分。Spring Boot 提供了一个强大的缓存框架&#xff0c;它支持多种缓存提供程序&#xff0c;包括 Redis、Ehcache、Ca…

国金QMT量化交易系统的Bug及应对策略

国金QMT量化交易系统中的 账号成交状态变化主推 deal_callback() &#xff0c; 当账号成交状态有变化时&#xff0c;这个函数被客户端调用。 我的策略是&#xff0c;在handlebar()里面挂单&#xff0c;等待成交&#xff0c;而判断成交的方式是根据系统主推deal_callback()通知…

数据结构与算法:查找、排序、动态规划、数学

1 查找表 查找表是同一数据类型构成的集合。只进行查找操作的称为静态查找表&#xff1b;在查找的同时进行插入和删除操作的称为动态查找表。 查找算法衡量好坏的依据为&#xff1a;查找成功时&#xff0c;查找的关键字和查找表中比较过的数据元素的个数的平均值&#xff0c;…

MKS SERVO4257D 闭环步进电机_系列10 arduino 例程

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&a…

HiEV独家|余承东力推L3标准,华为ADS更高阶产品将至

作者 | 张祥威 编辑 | 德新 L3标准出台提速&#xff0c;智驾江湖的厮杀将更加惨烈。 近日&#xff0c;多位接近华为的人士告诉HiEV&#xff0c;余承东正在力推自动驾驶L3标准尽快出台&#xff0c;华为的多位技术专家深度参与了L3标准制定。 本月稍早前&#xff0c;余承东在重庆…

计算机网络-数据链路层下篇

目录 计算机网络 七、MAC地址&#xff0c;IP地址及ARP地址 &#xff08;一&#xff09;MAC地址 &#xff08;二&#xff09;IP地址 &#xff08;三&#xff09;ARP地址 八、集线器和交换机的区别 九、以太网交换机自学习和转发帧的流程 十、以太网交换机的生成树协议ST…

一步一步学OAK之十三:实现RGB相机上的空间对象跟踪

前面我们实现了在RGB相机上进行物体的对象跟踪&#xff0c;能够实时跟踪我们想要追踪的物探&#xff0c;但是&#xff0c;如果我们要想知道这个物体的三维空间坐标&#xff0c;该如何实现呢&#xff1f;要想实现这个功能&#xff0c;我们需要用到DepthAI API提供的MobileNetSpa…

无人机动力测试台-50公斤级-Flight Stand 50

Flight Stand 50测试台通过测量电机和螺旋桨的拉力、扭矩、转速、电流、电压、温度、螺旋桨效率和电机效率来精准地描述和评估无人机动力系统的性能。 产品应用 Flight Stand 50测试台可以用于以下方向&#xff1a; 实时动态测试 FS50 Pro的1000 Hz采样率使测试成为可能&am…

使用 OAT 工具替换 OceanBase 云平台节点

OceanBase 环境基本都会先安装 OCP 来部署、监控、运维数据库集群。但如果有机器过保等问题&#xff0c;就需要有平稳的 OCP 节点的替换方案。 作者&#xff1a;张瑞远 上海某公司 DBA&#xff0c;曾经从事银行、证券数仓设计、开发、优化类工作&#xff0c;现主要从事电信级 I…

android:DataPicker控件使用

一、前言&#xff1a;我真的服了&#xff0c;刚开始再发布运行的时候一直报这个错误“ Attempt to invoke virtual method void android.widget.TextView.setText(java.lang.CharSequence) on a null object reference”说空指针。我也上网查了&#xff0c;网上说在这个错误不是…

mysql行数据转为列数据

最近在开发过程中遇到问题&#xff0c;需要将数据库中一张表信息进行行转列操作&#xff0c;再将每列&#xff08;即每个字段&#xff09;作为与其他表进行联表查询的字段进行显示。 借此机会&#xff0c;在网上查阅了相关方法&#xff0c;现总结出一种比较简单易懂的方法备用…

BI商业智能工具改变企业发展态势

BI商业智能工具在当今企业环境中扮演着越来越重要的角色&#xff0c;成为企业实现高速增长的关键因素之一。这些工具能够帮助企业应对海量数据挑战&#xff0c;提供更高效的数据处理和分析能力&#xff0c;为企业决策提供有力支持。以瓴羊Quick BI为例&#xff0c;它凭借其强大…

记事本软件误删后如何找回?

随着智能手机的普及&#xff0c;各种优秀的手机软件层出不穷&#xff0c;成为我们生活和工作中的得力助手。其中&#xff0c;记事本软件在手机上的应用也越来越受欢迎。 一款记事本可以给用户带来许多便利和帮助。与传统的纸质记事本相比&#xff0c;手机记事本具有更多的功能…

Java Spring多线程

Java Spring多线程 开启一个线程1 继承java.lang.Thread类2 实现java.lang.Runnable接口3 实现Callable接口4 实现线程池ThreadPoolExecutor Java线程池Executors 的类型Future与线程池 开启一个线程 https://blog.csdn.net/qq_44715943/article/details/116714584 1 继承java.…