Тестовое задание Сбер Java Многопоточность

preview_player
Показать описание
В этом видео я разбираю решение тестового задания по многопоточности из компании Сбер.
Рекомендации по теме
Комментарии
Автор

хм ... нельзя ссылку на git вставить, коммент удаляется. Небольшой код на основе SynchronousQueue, позволяет добавлять любое количество потоков, выполняющихся по схеме 1, 2, 3, 1, 2, 3, ...

mib-
Автор

нужна ссылка на проект, иначе трудно воспринимать

МихаилМенчинев
Автор

Привет Петр, спасибо. Я попробовал сделать через 2 BlockingQueue, в который один пишет, а другой ждет. Есть еще задачки? ))

yeldarnuralin
Автор

а зачем в первом примере в конце join() если он уже в лябде вызова потока? а во второй задаче можно просто преключаться через Semaphore.aquire() / release()

НикитаПосмак
Автор

Это тестовое задание на джуна или выше?

rafonvc
Автор

В этом видео я разбираю решение тестового задания по многопоточности из компании Сбер.
Стань программистом с www.job4j.ru

jobj
Автор

почему бы не рассмотреть CyclicBarrier, а вы точно уверены что не volatile флаги всегда будут отрабатывать как надо в syncronized? Может лучше сделать их AtomicBoolean или volatile?

alexandr
Автор

Как то в первой всё усложнено, можно проще: Thread third = new Thread(
() -> foo.third()
);

Thread second = new Thread(
() -> foo.second()
);

Thread first = new Thread(
() -> foo.first()
);

third.start();
third.join();
second.start();
second.join();
first.start();
first.join();

aZaZloKeR
Автор

public static void main(String[] args) throws InterruptedException {
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();

Semaphore semaphore1 = new Semaphore(1);
Semaphore semaphore2 = new Semaphore(0);

Thread thread1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
try {
semaphore1.acquire();
list.add("Tread 1 added " + i);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
semaphore2.release();
}
}
});

Thread thread2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
try {
semaphore2.acquire();
list.add("Tread 2 added " + i);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
semaphore1.release();
}
}
});

thread1.start();
thread2.start();

thread1.join();
thread2.join();


}

yauhenniashaptun
Автор

По первой задачи его решение работать не будет, пусть вызовет сотню раз.

public static void main(String[] args) throws InterruptedException {
CopyOnWriteArrayList<String> out = new CopyOnWriteArrayList<>();
Foo foo = new Foo(out);

Thread t1 = new Thread(foo::first);
Thread t2 = new Thread(foo::second);
Thread t3 = new Thread(foo::third);

t3.start();
t3.join();
t2.start();
t2.join();
t1.start();
t1.join();

System.out.println(out);
} // проще некуда

СергейПиунов-йк
Автор

class Foo {
static CopyOnWriteArrayList<String> out = new CopyOnWriteArrayList<>();
final ReentrantLock lock = new ReentrantLock();
final Condition firstCondition = lock.newCondition();
boolean flag = true;

void first() {
for (int i = 0; i < 5; i++) {
lock.lock();
try {
while (!flag) {
firstCondition.await();
}
out.add("first");
firstCondition.signal();
flag = false;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}

void second() {
for (int i = 0; i < 5; i++) {
lock.lock();
try {
while (flag) {
firstCondition.await();
}
out.add("second");
firstCondition.signal();
flag = true;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}

emirSulei
Автор

AtomicBoolean bFirst = new AtomicBoolean(true);
...
var first = new Thread(() -> {
int count = 1;
while (count <= 3) {
if (bFirst.get()) {
out.add("first");
bFirst.compareAndSet(true, false);
count++;
} else {
Thread.yield();
}
}
});

var second = new Thread(() -> {
int count = 1;
while (count <= 3) {
if (!bFirst.get()) {
out.add("second");
bFirst.compareAndSet(false, true);
count++;
} else {
Thread.yield();
}
}
});

alexnikol
Автор

package org.example;


import java.util.ArrayList;
import java.util.List;
import
import

public class Main {
public static void main(String[] args) throws InterruptedException {
temp temp = new temp();
CountDownLatch countDownLatch = new CountDownLatch(2938747);
CountDownLatch countDownLatch2 = new CountDownLatch(1);
var t1 = new Thread(() -> {
synchronized (temp) {
countDownLatch2.countDown();
temp.q1("first");
countDownLatch.countDown();

temp.waitqwe(temp);

temp.doSomeWith1Thread("first", countDownLatch, temp);

if(countDownLatch.getCount() % 2 != 0) {
temp.q1("first");
countDownLatch.countDown();
temp.notify();
}
}
});

var t2 = new Thread(() -> {


synchronized (temp) {
temp.doSomeWith2Thread("double", countDownLatch, temp);
temp.doSomeWith2Thread("double", countDownLatch, temp);

if(countDownLatch.getCount() % 2 == 0) {
temp.q1("double");
}
}
});

t1.start();
t2.start();

t1.join();
t2.join();


}

static void asdwaitlatch2(CountDownLatch countDownLatch2) {
try {
countDownLatch2.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}

class temp {
List<String> asd = new CopyOnWriteArrayList<>();

void q1(String qwe) {
asd.add(qwe);
}
void doSomeWith1Thread(String name, CountDownLatch countDownLatch, temp temp) {
if(countDownLatch.getCount() % 2 != 0) {
temp.q1(name);
countDownLatch.countDown();
temp.notify();
temp.waitqwe(temp);
}
}


void doSomeWith2Thread(String name, CountDownLatch countDownLatch, temp temp) {
if(countDownLatch.getCount() % 2 == 0) {
temp.q1(name);
countDownLatch.countDown();
temp.notify();
temp.waitqwe(temp);
}
}

void waitqwe(temp temp) {
try {
temp.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}

awdawdawdawdaw-hskv