From c2809edacc503fb99e51456473886fdfcd12ecdf Mon Sep 17 00:00:00 2001 From: kyriewhluo Date: Mon, 26 Aug 2024 20:03:18 +0800 Subject: [PATCH] =?UTF-8?q?```mock=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=92=8CReentrantLock=E6=BC=94=E7=A4=BA=E7=9A=84=E5=AE=9E?= =?UTF-8?q?=E7=94=A8=E7=A8=8B=E5=BA=8F=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加了一个实用程序方法来演示mock异常处理和ReentrantLock的使用。这个方法展示了如何使用CompletableFuture进行异步操作, 以及如何处理异常,包括超时和中断情况。还展示了如何使用ReentrantLock进行线程同步,并解释了lock和tryLock方法的区别。 ``` --- .../java/cn/whaifree/test/ThreadDemo1.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/main/java/cn/whaifree/test/ThreadDemo1.java b/src/main/java/cn/whaifree/test/ThreadDemo1.java index f7bdacd..3a7ce81 100644 --- a/src/main/java/cn/whaifree/test/ThreadDemo1.java +++ b/src/main/java/cn/whaifree/test/ThreadDemo1.java @@ -1,9 +1,12 @@ package cn.whaifree.test; +import javax.swing.plaf.synth.SynthOptionPaneUI; import java.lang.reflect.Proxy; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Supplier; public class ThreadDemo1 { @@ -189,6 +192,57 @@ class p2{ } +class mockException{ + + public static void main(String[] args) { + + + ThreadLocal objectThreadLocal = new InheritableThreadLocal<>(); + objectThreadLocal.set("test"); + objectThreadLocal.get(); + + ReentrantLock lock = new ReentrantLock(); + lock.tryLock(); + lock.lock(); + /** + * lock 方法 + * 阻塞等待:调用 lock() 方法时,如果锁已经被其他线程持有,当前线程将阻塞等待直到获得锁。 + * 不可中断:默认情况下,lock() 方法不会响应中断信号。这意味着即使当前线程被中断,它仍然会继续等待锁。 + * 保证获取锁:只要线程最终没有被中断或终止,它总会获取到锁。 + * tryLock 方法 + * 非阻塞:调用 tryLock() 方法时,如果锁可用,则立即获取锁并返回 true;如果锁已被其他线程持有,则立即返回 false 而不会阻塞等待。 + * 可选超时:tryLock 还有一个带超时参数的版本 tryLock(long time, TimeUnit unit),允许线程在指定时间内等待锁。如果在超时时间内锁仍未被获取,则返回 false。 + * 可中断:tryLock(long time, TimeUnit unit) 方法可以响应中断信号,如果线程在等待过程中被中断,则抛出 InterruptedException。 + */ + + CompletableFuture stringCompletableFuture = CompletableFuture.supplyAsync(new Supplier() { + @Override + public String get() { + try { + int num = 1 / 0; + Thread.sleep(2000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + return ""; + } + }); + String s = "-"; + try { + s = stringCompletableFuture.get(1, TimeUnit.SECONDS); + } catch (TimeoutException e) { +// System.out.println("超时了"); + s = "超时了"; + } catch (Exception e) { + System.out.println(e.getCause().getMessage()); + throw new RuntimeException(e); + } + + System.out.println(s); + } +} + + class MyException extends RuntimeException {