From 464f3280ac10eecb13cfa1121d31ca77c5095c9e Mon Sep 17 00:00:00 2001 From: lvhonghong <1102600675@qq.com> Date: Mon, 10 Jan 2022 01:04:52 +0800 Subject: [PATCH] add must lock demo --- java-thread.iml | 2 - .../liaoxuefeng/thread16_Future/Main.java | 46 +++++++-------- .../thread7_deadLock/DeadLockDemo.java | 15 +++++ .../thread7_deadLock/DeadLockTask.java | 56 +++++++++++++++++++ 4 files changed, 94 insertions(+), 25 deletions(-) delete mode 100644 java-thread.iml create mode 100644 src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockDemo.java create mode 100644 src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockTask.java diff --git a/java-thread.iml b/java-thread.iml deleted file mode 100644 index 78b2cc5..0000000 --- a/java-thread.iml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/java/com/xufx/thread/liaoxuefeng/thread16_Future/Main.java b/src/main/java/com/xufx/thread/liaoxuefeng/thread16_Future/Main.java index 663c220..48d0723 100644 --- a/src/main/java/com/xufx/thread/liaoxuefeng/thread16_Future/Main.java +++ b/src/main/java/com/xufx/thread/liaoxuefeng/thread16_Future/Main.java @@ -1,23 +1,23 @@ -package com.xufx.thread.liaoxuefeng.thread16_Future; - -import java.util.concurrent.*; - -/** - * Created by xufx on 2022/1/5 22:30 - * 执行多个任务的时候,使用线程池是很方便的,只要实现Runnable接口就行,但是Runnable接口有个问题,就是没有返回值。 - * 如果需要返回值,可以使用Java提供的Callable接口。Callable接口支持泛型,可以返回指定的结果 - * ExecutorService.submit()方法的返回值是Future。 - * Future的实例代表一个未来能获取结果的对象 - * Future获取异步执行结果时候,要么调用阻塞方法get(),要么轮询看isDone()是否返回true,弊端是主线程都要跟着等待了。 - */ -public class Main { - public static void main(String[] args) throws ExecutionException, InterruptedException { - ExecutorService executor = Executors.newFixedThreadPool(4); - //定义任务 - Callable task = ()-> "hhhhh"; - Future future = executor.submit(task); - //可能会导致阻塞(如果异步任务没有完成就会导致阻塞) - String s = future.get(); - System.out.println(s); - } -} +package com.xufx.thread.liaoxuefeng.thread16_Future; + +import java.util.concurrent.*; + +/** + * Created by xufx on 2022/1/5 22:30 + * 执行多个任务的时候,使用线程池是很方便的,只要实现Runnable接口就行,但是Runnable接口有个问题,就是没有返回值。 + * 如果需要返回值,可以使用Java提供的Callable接口。Callable接口支持泛型,可以返回指定的结果 + * ExecutorService.submit()方法的返回值是Future。 + * Future的实例代表一个未来能获取结果的对象 + * Future获取异步执行结果时候,要么调用阻塞方法get(),要么轮询看isDone()是否返回true,弊端是主线程都要跟着等待了。 + */ +public class Main { + public static void main(String[] args) throws ExecutionException, InterruptedException { + ExecutorService executor = Executors.newFixedThreadPool(4); + //定义任务 + Callable task = ()-> "hhhhh"; + Future future = executor.submit(task); + //可能会导致阻塞(如果异步任务没有完成就会导致阻塞) + String s = future.get(); + System.out.println(s); + } +} diff --git a/src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockDemo.java b/src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockDemo.java new file mode 100644 index 0000000..67a2205 --- /dev/null +++ b/src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockDemo.java @@ -0,0 +1,15 @@ +package com.xufx.thread.liaoxuefeng.thread7_deadLock; + +public class DeadLockDemo { + + public static void main(String[] args) { + Object object1 = new Object(); + Object object2 = new Object(); + Thread t1 = new Thread(new DeadLockTask(object1, object2, false), "thread-1"); + Thread t2 = new Thread(new DeadLockTask(object1, object2, true), "thread-2"); + + t1.start(); + t2.start(); + } + +} diff --git a/src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockTask.java b/src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockTask.java new file mode 100644 index 0000000..80a8dcf --- /dev/null +++ b/src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockTask.java @@ -0,0 +1,56 @@ +package com.xufx.thread.liaoxuefeng.thread7_deadLock; + +public class DeadLockTask implements Runnable { + private Object lock1; + private Object lock2; + private Boolean flag; + + + public DeadLockTask(Object o1, Object o2, Boolean flag) { + this.lock1 = o1; + this.lock2 = o2; + this.flag = flag; + } + + @Override + public void run() { + + synchronized (lock1) { + if (flag) { + System.out.println(Thread.currentThread().getName() + "---- Xixi:holding orange..."); + + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + + System.out.println(Thread.currentThread().getName() + "---- Xixi: waiting for lock of Hoho"); + synchronized (lock2) { + System.out.println(Thread.currentThread().getName() + "---- Xixi: got Hoho's lock: apple"); + } + } + } + + if (!flag) { + System.out.println(Thread.currentThread().getName() + "---- Hoho:holding apple..."); + + synchronized (lock2) { + + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + System.out.println(Thread.currentThread().getName() + "---- Hoho: waiting for lock of Xixi"); + synchronized (lock1) { + System.out.println(Thread.currentThread().getName() + "---- Hoho: got Xixi's lock: orange"); + } + } + + } + + } +} -- Gitee