当前位置: 首页>资讯 >

世界消息!java线程的创建和管理(二)

来源: 腾讯云 | 时间: 2023-04-04 01:09:05 |

四、线程同步与互斥

Java 中的线程同步和互斥机制可以防止多个线程同时访问共享资源导致数据不一致的问题。Java 中的线程同步和互斥机制有多种实现方式,包括 synchronized 关键字、Lock 接口、Semaphore 类、Condition 接口等。


(资料图片仅供参考)

synchronized 关键字

synchronized 关键字可以保证同步访问共享资源,其用法有两种:

修饰实例方法

在方法前加上 synchronized 关键字,保证同一时刻只有一个线程能够执行该方法。

public synchronized void method() {    // 同步代码块}
修饰代码块

在代码块前加上 synchronized 关键字,保证同一时刻只有一个线程能够执行该代码块。

public void method() {    synchronized (this) {        // 同步代码块    }}

Lock 接口

Lock 接口提供了比 synchronized 更为灵活的锁机制。Lock 接口有多个实现类,其中最常用的是 ReentrantLock 类。ReentrantLock 类实现了 Lock 接口,使用方式如下:

import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class MyRunnable implements Runnable {    private Lock lock = new ReentrantLock(); // 创建可重入锁    @Override    public void run() {        lock.lock(); // 获取锁        try {            // 同步代码块        } finally {            lock.unlock(); // 释放锁        }    }}

在该例子中,我们使用 ReentrantLock 类创建了一个可重入锁,并在 run() 方法中使用了 lock() 方法获取锁,使用了 unlock() 方法释放锁。

Semaphore 类

Semaphore 类可以控制并发线程的数量,其用法如下:

import java.util.concurrent.Semaphore;public class MyRunnable implements Runnable {    private Semaphore semaphore = new Semaphore(2); // 创建 Semaphore 对象,限制线程数量为 2    @Override    public void run() {        try {            semaphore.acquire(); // 获取许可证            // 同步代码块        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            semaphore.release(); // 释放许可证        }    }}

在该例子中,我们创建了一个 Semaphore 对象,限制线程数量为 2,然后在 run() 方法中使用了 acquire() 方法获取许可证,使用了 release() 方法释放许可证。

Condition 接口

Condition 接口可以实现线程之间的通信,其用法如下:

import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class MyRunnable implements Runnable {    private Lock lock = new ReentrantLock();    private Condition condition = lock.newCondition(); // 创建条件变量    @Override    public void run() {        lock.lock();        try {            while (true) {                condition.await(); // 等待信号                // 处理信号            }        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            lock.unlock();        }    }    public void signal() {        lock.lock();        try {            condition.signal(); // 发送信号        } finally {            lock.unlock();        }    }}

在该例子中,我们使用 Lock 和 Condition 接口实现了线程之间的通信。在 run() 方法中,我们使用了 await() 方法等待信号,使用了 signal() 方法发送信号。

五、线程池

线程池是一种重用线程的机制,可以避免线程的频繁创建和销毁,提高了线程的利用率。Java 中的线程池是通过 Executor 框架实现的,包括 Executor、ExecutorService 和 ThreadPoolExecutor 三个类。

Executor

Executor 是一个接口,只定义了一个 execute(Runnable command) 方法,用于执行 Runnable 对象。

import java.util.concurrent.Executor;public class MyRunnable implements Runnable {    @Override    public void run() {        // 线程执行的代码    }}public class Test {    public static void main(String[] args) {        Executor executor = Executors.newSingleThreadExecutor(); // 创建 Executor 对象        executor.execute(new MyRunnable()); // 执行线程    }}

在该例子中,我们使用 Executors 工厂类创建了一个单线程的 Executor 对象,然后使用 execute() 方法执行了一个 MyRunnable 对象。

ExecutorService

ExecutorService 接口继承自 Executor 接口,提供了更多的方法,如提交任务、关闭线程池等。

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class MyRunnable implements Runnable {    @Override    public void run() {        // 线程执行的代码    }}public class Test {    public static void main(String[] args) {        ExecutorService executorService = Executors.newFixedThreadPool(2); // 创建 ExecutorService 对象        executorService.execute(new MyRunnable()); // 执行线程        executorService.shutdown(); // 关闭线程池    }}

在该例子中,我们使用 Executors 工厂类创建了一个固定大小为 2 的线程池,然后使用 execute() 方法执行了一个 MyRunnable 对象,最后使用 shutdown() 方法关闭了线程池。

ThreadPoolExecutor

ThreadPoolExecutor 类是 ExecutorService 接口的默认实现,提供了更为灵活的线程池管理。

import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class MyRunnable implements Runnable {    @Override    public void run() {        // 线程执行的代码    }}public class Test {    public static void main(String[] args) {        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS, new LinkedBlockingQueue()); // 创建 ThreadPoolExecutor 对象        threadPoolExecutor.execute(new MyRunnable()); // 执行线程        threadPoolExecutor.shutdown(); // 关闭线程池    }}

在该例子中,我们使用 ThreadPoolExecutor 类创建了一个大小为 2-4 的线程池,使用 execute() 方法执行了一个 MyRunnable 对象,最后使用 shutdown() 方法关闭了线程池。

关键词:

 

热文推荐

世界消息!java线程的创建和管理(二)

Java中的线程同步和互斥机制可以防止多个线程同时访问共享资源导致数据不一致的问题。Java中的线程同步和互斥机制有多种实现方式,包括synchroniz

2023-04-04

“史上最能打的4月”,能吸引观众进影院吗? 每日快看

“史上最能打的4月”,能吸引观众进影院吗?---每年的电影春季档,都是全年影市最冷清的时候,佳作难寻,观众寥寥,这段时间也被业界视为春节

2023-04-03

天天精选!国乒公布德班世乒赛参赛名单 王楚钦、孙颖莎“三线作战”

[新闻页-台海网]中新社北京4月3日电中国乒乓球队3日在北京举行新闻发布会,公布德班世乒赛参赛名单。樊振东、马龙、

2023-04-03

约基奇与恩比德的MVP之争

MVP的评选过程,往往也不会出现直到常规赛的收官阶段,还依旧是充满悬念的情况。本赛季MVP评选是比较难选择的一年,不久前ESPN内部进行了MVP模

2023-04-03

马英九一行参访湖南大学 两岸青年亲切对话|全球快讯

2日上午,马英九先生带领台湾青年学生参访湖南大学,并与该校学生交流座谈。

2023-04-03

最前线丨降价奏效了,特斯拉一季度交付42.28万辆车,再创新高

市场竞争将更为激烈,特斯拉需灵活应对。

2023-04-03

国家博物馆讲座还需要预约博物馆门票吗?

国家博物馆讲座还需要预约博物馆门票吗?答:如果只是参加讲座,可不用预约博物馆门票,但如果要参观博物馆,小编建议提前预约博物馆参观。国家

2023-04-03

C视频丨台青寻宝秀第二季③:宁南山林之宝 助农增收效益好

《台青寻宝秀》第二季迎来收官!这一站,暨南大学台生傅继娴来到了中国蚕桑之乡凉山彝族自治州宁南县,在这里,她发现了几个神秘的白色大棚,

2023-04-03

闲话上海:五花八门吃咖啡

01:21上海是全球咖啡馆最多的城市,来自世界各地的咖啡在上海展现各自的风采和魅力。3月,一场百年咖啡经典展览活动在思南

2023-04-03

每日热闻!华人球手首度问鼎奥古斯塔女子业余赛

原标题:华人球手首度问鼎奥古斯塔女子业余赛羊城晚报记者梁劲松代表全球女子业余最高水平的奥古斯塔高尔夫女子业余赛,今年这一届打到最后成

2023-04-03

英雄之光|17家媒体为石家庄烈士寻亲进行时,烈士后人陆续打来电话认亲

燕赵都市报纵览新闻记者蔡艳荣、胡邵斐、丁子轩纵览客户端联合全国16家媒体为90位长眠石家庄烈士寻亲的报道引起了全国各地主流媒体和当地退役

2023-04-03

天天新资讯:小伙想挣“快钱”,结果倒贴200元,还被警方抓了!

为赚“好处费”十堰小伙刚子(化名)将自己和好友的电话卡出借结果钱没赚到人却被十堰经开区公安分局刑侦大队抓了3月23日上午,刚子在家中打游

2023-04-03

光伏产业或将面临石英坩埚短缺危机,石英股份逼近涨停|关注

4月3日消息,光伏板块震荡反弹,石英股份盘中涨超9 5%,报价135 79元,逼近涨停线135 83元。市场预计2023

2023-04-03

颈部淋巴结疼痛是什么原因_颈部淋巴疼痛是什么原因

1、颈部淋巴结疼痛最常见的原因是炎症,会有明显的疼痛和腹胀感,但也可能是上呼吸道感染、口腔疾病、上肢感染和炎症等引起的。

2023-04-03

中国国产大飞机C919敦煌机场创大强度试飞多项纪录 世界最资讯

今年是中国国产大飞机C919进入国内市场的第一年,其“一举一动”都备受全球瞩目。

2023-04-03

广西“三农”工作突出抓好粮食生产_热点聚焦

【原标题】我区“三农”工作突出抓好粮食生产粮食生产目标任务4月5日前全部分解到村屯突出抓好粮食生产,着力稳定生猪生产,加快发展设施蔬菜

2023-04-03

【世界速看料】开山股份:3月31日融资买入642.24万元,融资融券余额3.65亿元

3月31日,开山股份(300257)融资买入642 24万元,融资偿还687 18万元,融资净卖出44 94万元,融资余额3 56亿元。

2023-04-03

和平区:打造多元消费场景 丰富夜生活 做强夜经济

天津北方网讯:借助海棠花开带来的客流,和平区也抓住机会,将白天的热度延续到夜晚,打造多元消费场景,丰富夜生活,做强夜经济。近期推出的

2023-04-03

dota龙骑士出装_来看看吧

欢迎观看本篇文章,小勉来为大家解答以上问题。dota龙骑士出装,来看看吧很多人还不知道,现在让我们一起来看看吧!1、DO

2023-04-01

驻香港部队组织联合巡逻锤炼联合行动能力

本报讯刘应、易定报道日前,驻香港部队出动陆海空三军部分兵力,组织联合巡逻,锤炼部队快速筹划、紧急出动、特情处置、联合行动等作战能力。

2023-04-01