多线程(Day21)

多线程

        程序 进程 线程

        程序:一堆代码的封装,指的是我们保存在硬盘中的可执行文件。静态概念

        进程:正在执行或等待执行的程序,在运行内存中处理。动态概念

        线程:程序运行时,不同的执行分支。

        Java来说,当我们的程序开始执行,也就是main方法开始执行,在栈内存中开辟以main方法为栈底元素的栈帧。此时,这个以main方法为栈底元素的链式栈帧调用就称为线程。

        并发并行

        并发:同时发生

        并行:同时执行

        单核CPU和多核CPU

        1个CPU只能做一件事,所以没有办法并行执行,但是可以并发执行。

        单核CPU是假的多线程,因为一个单位时间内,只能执行一个线程任务,多核CPU才能更好发挥多线程的效率

        线程创建

        创建线程有两种方式

        1.继承Thread类,并覆写run方法

        2.实现Runnable接口,并覆写run方法

Thread

        使用方式

         Runnable

优先级和常用方法

        优先级

        在Java中提供了1-10共10个优先级,在Thread中提供了三个常量,MIN_PRIORITY 代表1,NORM_PRIORITY 代表5,MAX_PRIORITY 代表10。子类 默认继承父类优先级,Thread默认是5

        常用方法     

        setPriority 设置优先级

         getPriority 获取优先级

        getName 获取线程名称

        setName 设置线程名字,如果不设置名字,默认为 Thread_0 开始,以此类推

         static  currentThread  获取当前线程对象

        static sleep 让当前线程进入睡眠状态,参数为毫秒

        使用方式

线程控制

        线程停止 

         线程合并

         Yield

        Thread.yield 暂停当前正在执行的线程,并执行其他线程,并且只给同优先级让位。

 

线程同步

        方法锁‘

        Synchronized

        访问一个加锁的成员方法/成员语句块时,该对象中所有加锁的成员方法/成员语句块都会被锁定。

        访问一个加锁的静态方法/静态语句块时,该对象中所有加锁的静态方法/静态语句块都会被锁定。

        synchronized(对象){}   对象语句块(成员语句块)

        synchronized(类名。class){}    类语句块(静态语句块)

        使用方式

        方法锁

        语句块锁

 

        Lock

        从JDK 5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当.

        java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的 工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象 加锁,线程开始访问共享资源之前应先获得Lock对象

        ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和 内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以 显式加锁、释放锁。

        Lock是显式锁,需要手动开启手动关闭,并且JVM将花费较少的时间来完成线程调度.性能更好,并且还具备更好的扩展性.

        使用方式

 

守护线程

        守护线程:每一个main主程序的开启,都会同时开启一个守护线程来监听我们的正常程序执行。当没有线程执行的时候,守护线程也就终止了。

        使用方式

 定时器任务

        定时器:计划任务,只要有一个计划任务,就会开启一个线程,进行计时监听

        使用方式

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,没有找到关于ES多线程分组分页查询的信息。不过,ES支持多线程查询和分组分页查询,可以分别介绍一下。 1. ES多线程查询 ES支持多线程查询,可以通过设置线程池来控制并发查询的数量。以下是一个使用Python Elasticsearch库进行多线程查询的例子: ```python from elasticsearch import Elasticsearch from elasticsearch.helpers import parallel_bulk from multiprocessing import Pool es = Elasticsearch() def process_data(data): # 处理数据的函数 pass def index_data(data): # 索引数据的函数 pass def run_query(query): # 运行查询的函数 pass def run_parallel_bulk(data): with Pool(processes=4) as pool: for success, info in parallel_bulk(es, data, index='my-index', chunk_size=1000, thread_count=4): if not success: print('A document failed:', info) ``` 在上面的例子中,我们使用了Python的multiprocessing库来创建一个进程池,然后使用Elasticsearch的parallel_bulk函数来并发地索引数据。 2. ES分组分页查询 ES支持分组分页查询,可以使用Elasticsearch的search方法来实现。以下是一个使用Python Elasticsearch库进行分组分页查询的例子: ```python from elasticsearch import Elasticsearch es = Elasticsearch() def search_data(): query = { "size": 0, "aggs": { "group_by_field": { "terms": { "field": "my_field", "size": 10 }, "aggs": { "group_by_date": { "date_histogram": { "field": "my_date_field", "interval": "day" }, "aggs": { "sum_by_field": { "sum": { "field": "my_sum_field" } } } } } } } } res = es.search(index="my-index", body=query) return res ``` 在上面的例子中,我们使用了Elasticsearch的聚合功能来进行分组分页查询。我们首先按照my_field字段进行分组,然后按照my_date_field字段进行日期直方图聚合,最后对my_sum_field字段进行求和聚合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值