速读:java线程的创建和管理(二)
Java中的线程同步和互斥机制可以防止多个线程同时访问共享资源导致数据不一致的问题。Java中的线程同步和互斥机制有多种实现方式,包括synchroniz
腾讯云 2023-04-03 14:44:13
Java 中的线程同步和互斥机制可以防止多个线程同时访问共享资源导致数据不一致的问题。Java 中的线程同步和互斥机制有多种实现方式,包括 synchronized 关键字、Lock 接口、Semaphore 类、Condition 接口等。
synchronized 关键字可以保证同步访问共享资源,其用法有两种:
【资料图】
在方法前加上 synchronized 关键字,保证同一时刻只有一个线程能够执行该方法。
public synchronized void method() { // 同步代码块}修饰代码块在代码块前加上 synchronized 关键字,保证同一时刻只有一个线程能够执行该代码块。
public void method() { synchronized (this) { // 同步代码块 }}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 类可以控制并发线程的数量,其用法如下:
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 接口可以实现线程之间的通信,其用法如下:
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 是一个接口,只定义了一个 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 接口继承自 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 类是 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中的线程同步和互斥机制有多种实现方式,包括synchroniz
原标题:牟定县劲吹绿色文明祭扫风梨花风起正清明,花香文明寄哀思。近日,牟定县城南大街鲜花店生意火爆,店门口摆满了黄菊、白
随着2023年一季度顺利收官,在去年债基收益不及预期,机构资产再配置压力,以及增厚投资收益和同质化竞争的压力下,今年开年已有19只债基陆续
》》》2023天津河北区公租房登记规则(第二季度)(一)申请家庭按照《符合条件通知单》标注的家庭类别、可配租标准进行登记。(二)登记时限
可以有以下几点能够解除劳动合同:1、因房屋主体结构质量不合格不能交付使用,或者房屋交付使用后,房屋主体结构质量经核验确属不合格的;2、房
据名记Shams报道,新的劳资协议调整了一些薪资相关的细节。其中,中产特例的大小增加了7 5%,空间特例的大小增加了30%。注:空间特例指低于工
全国政协十四届一次会议新闻发布会定于3月3日(星期五)16:30在人民大会堂一层新闻发布厅举行,大会新闻发言人郭卫民将向中外媒体介绍本次大
3月31日,2023年武汉市洪山区农业科技成果供需对接活动在湖北农科孵化公司园区举行。湖北省农科院等相关科技单位现场签约总金额达608万,现场
三十六年前,王锡荣兄和我在《申报·自由谈》作者唐弢先生指导下,编选了《〈申报·自由谈〉杂文选》(以下简称《杂文选》),由上海文艺出版
【记者许予朋】3月31日,国家外汇管理局公布2022年末中国外债数据。截至2022年末,我国全口径(含本外币)外债余额为170825亿元人民币(等值24528
大家好,我是良许。在我的直播间,每天晚上都有人在问,我今年30多岁了,还能不能转行做程序员呢?我一般都跟大家讲,学编程最好在30岁以内,
1、《模拟集成电路及应用》一书的出版社是中国铁道出版社。2、出版时间是1992-02。
IT之家4月1日消息,根据美国商标和专利局(USPTO)公示的商标清单,苹果获得了一项充电头专利。苹果提供的设计草图显示,这款充电头体积小巧、
【北上资金连续3周加仓超百亿元】本周,北上资金净买入104 64亿元,连续第3周加仓A股超百亿元,成交量自沪深港通大扩容来连续4周增加,达5797
【大河财立方消息】3月31日,中国邮政集团有限公司召开领导班子(扩大)会议。受中央组织部领导委托,中央组织部有关干部局负