From 60741076a097e149cf5db60a68c8a4e1e456efa2 Mon Sep 17 00:00:00 2001 From: Safer68 Date: Sun, 16 Jan 2022 16:10:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20Lesson20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Lesson20/MyDeadlock.java | 21 ++++++++++ src/Lesson20/Task55.java | 29 +++++++++++++ src/Lesson20/Task56.java | 21 ++++++++++ src/Lesson20/Task57.java | 79 ++++++++++++++++++++++++++++++++++++ 4 files changed, 150 insertions(+) create mode 100644 src/Lesson20/MyDeadlock.java create mode 100644 src/Lesson20/Task55.java create mode 100644 src/Lesson20/Task56.java create mode 100644 src/Lesson20/Task57.java diff --git a/src/Lesson20/MyDeadlock.java b/src/Lesson20/MyDeadlock.java new file mode 100644 index 0000000..0e04e46 --- /dev/null +++ b/src/Lesson20/MyDeadlock.java @@ -0,0 +1,21 @@ +package Lesson20; + +public class MyDeadlock { + + public synchronized void acceptThread(MyDeadlock thread) { + + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + thread.printThread(); + } + + public synchronized void printThread() { + + System.out.println(Thread.currentThread().getName()); + + } + +} diff --git a/src/Lesson20/Task55.java b/src/Lesson20/Task55.java new file mode 100644 index 0000000..cfd2a1d --- /dev/null +++ b/src/Lesson20/Task55.java @@ -0,0 +1,29 @@ +package Lesson20; + +import java.util.stream.Stream; + +/** + * * Создать метод, который печатает название потока и засыпает на 2 секунды. + * Запустить одновременно 10 потоков. + * Реализовать механизм синхронизации, чтобы все потоки выполнились последовательно. + */ +public class Task55 { + + public static void main(String[] args) throws InterruptedException { + + Stream.generate(() -> new Thread(Task55::printNameThread)) + .limit(10) + .forEach(Thread::start); + } + + public static synchronized void printNameThread() { + System.out.println(Thread.currentThread().getName()); + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } +} + diff --git a/src/Lesson20/Task56.java b/src/Lesson20/Task56.java new file mode 100644 index 0000000..6c97025 --- /dev/null +++ b/src/Lesson20/Task56.java @@ -0,0 +1,21 @@ +package Lesson20; + +/** + * Создать программу, которая реализует deadlock между тремя потоками. + */ +public class Task56{ + + public static void main(String[] args) { + + MyDeadlock myDeadlock = new MyDeadlock(); + MyDeadlock myDeadlock1 = new MyDeadlock(); + MyDeadlock myDeadlock2 = new MyDeadlock(); + + new Thread(() -> myDeadlock.acceptThread(myDeadlock1)).start(); + new Thread(() -> myDeadlock1.acceptThread(myDeadlock2)).start(); + new Thread(() -> myDeadlock2.acceptThread(myDeadlock)).start(); + + } + +} + diff --git a/src/Lesson20/Task57.java b/src/Lesson20/Task57.java new file mode 100644 index 0000000..5f0a303 --- /dev/null +++ b/src/Lesson20/Task57.java @@ -0,0 +1,79 @@ +package Lesson20; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.stream.Stream; + +/** + * Есть 3 производителя и 2 потребителя, все разные потоки и работают все + * одновременно. Есть очередь с 200 элементами. Производители добавляют + * случайное число от 1..100, а потребители берут эти числа. Если в очереди + * элементов >= 100 производители спят, если нет элементов в очереди – потребители спят. + * Если элементов стало <= 80 производители просыпаются. + * Все это работает до тех пор, пока обработанных элементов не станет 10000, только потом программа завершается. + */ +public class Task57 { + public static final List list = new ArrayList<>(); + + private static int s = 0; + private static final int limit = 10000; + + public static void main(String[] args) { + Stream.generate(() -> new Random().nextInt(100)).limit(200).forEach(list::add); + + new Thread(Task57::startConsumer).start(); + new Thread(Task57::startConsumer).start(); + + new Thread(Task57::startManufacturer).start(); + new Thread(Task57::startManufacturer).start(); + new Thread(Task57::startManufacturer).start(); + + } + + private static void startManufacturer() { + while (s < limit) { + addList(); + } + } + + private static void startConsumer() { + while (s < limit) { + removeList(); + } + } + + private static void removeList() { + synchronized (list) { + if (list.size() != 0) { + list.notify(); + list.remove(0); + s++; + + } else { + try { + list.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + + public static void addList() { + synchronized (list) { + if (list.size() >= 100) { + try { + list.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + if (list.size() <= 80) { + list.notifyAll(); + list.add(new Random().nextInt(100)); + } + } + } + +}