天天最新:java线程的创建和管理(二)

2023-04-04 08:39:40 来源:腾讯云 分享到:

四、线程同步与互斥

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线程的创建和管理(二)

来源:腾讯云 2023-04-04 08:39:40

世界今亮点!5次测试4次失败,美国空军:不要了

来源:中评网 2023-04-04 07:24:00

聚焦:天津半永久哪里好(天津半永久化妆费用)

来源:穿搭阁 2023-04-04 05:57:56

微速讯:揭秘星系潮汐

来源:大科技杂志社 2023-04-04 02:07:25

天天亮点!严防森林火灾 山东召开全省森林草原防灭火工作视频调度会

来源:海报新闻 2023-04-03 22:35:35

环球讯息:3月数据出炉 出现让人意外的两点

来源:叶檀财经 2023-04-03 21:30:22

环球关注:国际金价下跌,OPEC+出奇招,FED或被逼向死角

来源:和讯网 2023-04-03 20:10:14

环球微资讯!外交部:对坂本龙一去世表示哀悼是什么情况

来源:互联网 2023-04-03 19:05:50

全球速读:最新通报:海珠区七星岗一厂房火灾已基本被扑灭

来源:广州日报 2023-04-03 18:17:39

世界动态:2023年4月3日山东省三氟乙酸乙酯价格最新行情预测

来源:报告网 2023-04-03 17:23:37

新动态:马斯克母亲结束为期两周的中国之旅:Ins发帖感谢中国

来源:游民星空 2023-04-03 16:28:27

热门:小米小爱音箱儿童版已经开启预售

来源:DoNews 2023-04-03 15:51:02

世界资讯:中国风电,挺进深远海

来源:国资小新 2023-04-03 15:07:06

全球观察:i am sorry dont leave me什么歌_im sorry dont live me是什么歌

来源:互联网 2023-04-03 14:15:05

焦点资讯:郑州棉织路车辆乱停放问题咋解决?这个办事处多方联动现场督导

来源:大河报网 2023-04-03 13:22:09

每日快报!黄河流域算网联盟成立

来源:科技日报 2023-04-03 12:43:58

世界最资讯丨4月3日算力概念板块涨幅达5%

来源:东方财富Choice数据 2023-04-03 12:16:41

世界动态:调查研究须揪“事”求“是”

来源:中工网 2023-04-03 11:50:32

环球速讯:第二十一章 无双

来源:哔哩哔哩 2023-04-03 10:50:37

天天观焦点:这一国宣布了!禁止使用ChatGPT

来源:央视财经 2023-04-03 10:08:42

全球观察:中距离大师!英格拉姆36+8率队取胜

来源:北青网-北京青年报 2023-04-03 09:53:30

环球快看点丨良心呢?把72岁奶奶骗到五华区一酒店转账27万

来源:昆明日报-掌上春城 2023-04-03 09:06:28

世界速读:重磅!明天起,美国各有1500万人被取消“白卡”免费医疗!纳税人:太好了……

来源:林小朱影院 2023-04-01 13:20:43

短讯!东盟计划加强本地货币使用以应对全球危机

来源:中国经济网 2023-04-01 11:44:49

每日观点:辽宁深入实施城市更新行动

来源:经济日报 2023-04-01 10:18:19

环球百事通!当日快讯:安理会审议乌克兰危机涉核问题,中方呼吁切实降低核战争风险

来源:互联网 2023-04-01 09:03:44

前沿资讯!约谈!全网禁言!官方出手了

来源:北京日报 2023-04-01 06:59:49

今日最新!电饭煲做奶油蛋糕的方法 电饭煲做奶油蛋糕怎么做好吃

来源:伊秀经验网 2023-04-01 06:01:41

天天微动态丨直通赛后的国乒主力现状:3人失意,1小将带来惊喜,5人直通成功

来源:国球发烧者 2023-04-01 02:08:34

天天新动态:吸血鬼骑士同人小说双男主_吸血鬼骑士同人小说

来源:互联网 2023-03-31 22:39:27

Copyright   2015-2022 纵横知识产权网 版权所有  备案号:浙ICP备2022016517号-12   联系邮箱:51 46 76 11 3 @qq.com