全球观焦点:java线程的创建和管理(二)

2023-04-04 10:52:53 | 来源:腾讯云

四、线程同步与互斥

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

陈年纠纷3个多小时化解

现场达成初步就业意向1000余人次

马斯克将Twitter图标换成柴犬 狗狗币价格应声飙升超30%_全球视讯

洪都航空:融资净买入44.88万元,融资余额7.37亿元(04-03)

当前最新:德清科邦晶体纤维有限公司

全球速讯:4月3日基金净值:嘉实蓝筹优势混合A最新净值0.8602,跌0.29%

139邮箱手机登录入口_139邮箱手机登录_环球热点评

“情景党课”续写先烈荣光

盘龙药业:公司一种抑制冠状病毒3CL蛋白酶活性的3-三唑基甲基-1,3,5-三嗪-2,4-二酮类化合物及其制备方法和应用获得美国专利授权_天天简讯

天津师范大学自考本科(天津师范大学几本)

2023长沙城区小升初配套入学报名材料有哪些

如何运用新颖的创意营销方式提升软文营销效果

速讯:你梦想的皮卡是?请开始你的创意@青年学子

【世界独家】马来西亚科工部长郑立慷到访小牛电动 中国智能两轮技术助力大马实现绿色能源转型

最新新闻

全球观焦点:java线程的创建和管理(二)

陈年纠纷3个多小时化解

现场达成初步就业意向1000余人次

马斯克将Twitter图标换成柴犬 狗狗币价格应声飙升超30%_全球视讯

洪都航空:融资净买入44.88万元,融资余额7.37亿元(04-03)

当前最新:德清科邦晶体纤维有限公司

全球速讯:4月3日基金净值:嘉实蓝筹优势混合A最新净值0.8602,跌0.29%

139邮箱手机登录入口_139邮箱手机登录_环球热点评

“情景党课”续写先烈荣光

盘龙药业:公司一种抑制冠状病毒3CL蛋白酶活性的3-三唑基甲基-1,3,5-三嗪-2,4-二酮类化合物及其制备方法和应用获得美国专利授权_天天简讯

天津师范大学自考本科(天津师范大学几本)

2023长沙城区小升初配套入学报名材料有哪些

如何运用新颖的创意营销方式提升软文营销效果

速讯:你梦想的皮卡是?请开始你的创意@青年学子

【世界独家】马来西亚科工部长郑立慷到访小牛电动 中国智能两轮技术助力大马实现绿色能源转型

以桃为媒 以旅促商|浦东新区大团镇举行“桃花节”招商推介会 天天快消息

丝芭电商公司因肖像权纠纷被执行 全球快消息

世界微头条丨水利建设基金怎么算 举例_水利建设基金怎么算

当前信息:广东新型储能参与电力市场交易方案印发!明确源网荷各侧储能交易规则

要闻速递:车友群:不少人买比亚迪后就得了一种病,叫“抠病”,而且病得越来越严重

9.2万人次! 南昌瀛上墓区迎祭扫小高峰 世界短讯

环球聚焦:用绝毛膏剃光头可以吗_用绝毛膏剃光头

百人会现场丨徐长明:电动车市场健康运行仍需政策支持

混合痔为什么不给割完 每日焦点

世界观察:二叉树遍历_二叉树

深圳机场三跑道扩建主跑道区回填砂提前全线合龙贯通

宁夏:全力做好建设工程质量安全消防工作_世界焦点

当前聚焦:玩转内江丨金黄色的“花海”!内江资中大片黄花风铃木盛开

每日消息!职场第一打工仔分享老板惯用忽悠员工的4种手法!

金辉控股(09993.HK):3月31日南向资金减持24.1万股