java线程的创建和管理(二)

2023-04-03 22:30:44 来源:腾讯云

四、线程同步与互斥

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() 方法关闭了线程池。

标签:

江苏省友协工作专题交流会在南通召开 焦点热讯

2023-03-30 16:56:49

全球快消息!原油震荡,看涨看跌?

2023-03-30 16:23:29

环球百事通!亚玛顿:公司目前在江苏以及河南等地合计持有约100MW左右的光伏发电站项目

2023-03-30 15:22:32

江苏常州金店周四(3月30日)黄金价格558元/克

2023-03-30 14:48:43

快讯:佳禾食品急速拉升5.17% 主力资金净流入112.33万元

2023-03-30 13:16:24

马来西亚-中国总商会总会长卢国祥:马中企业家大会计划今年移师海南举办 全球滚动

2023-03-30 12:19:19

每日报道:035期黄四郎双色球预测奖号:红球质合分析

2023-03-30 11:30:03

机械手表和石英手表的区别是什么 机械手表和石英手表区别 天天即时

2023-03-30 10:51:22

渤海银行擅自划扣恒大誉苑项目监管资金,被湖南省暂停商品房预售资金监管合作

2023-03-30 10:39:18

虞平阿石拉比会见国网四川省电力公司董事长衣立东

2023-03-30 08:19:48

多款抗生素、肝素、抗血栓药物将降价 平均降幅56% 第八批国家组织药品集采海南开标

2023-03-30 07:01:34

白癣皮的功效与作用的功能与主治的功效与作用-天天观焦点

2023-03-30 04:57:05

多城人口增量“断崖式”放缓 具体详细内容是什么 当前热讯

2023-03-30 00:52:53

世界报道:上海:儿科医院的“爱心厨房”

2023-03-29 22:15:08

第二人格会杀死第一人格吗(第二人格)_环球关注

2023-03-29 20:55:27
x 广告
x 广告

Copyright @  2015-2022 人人晚报网版权所有  备案号: 粤ICP备18023326号-36   联系邮箱:8557298@qq.com