Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 19.10.2016
Сообщений: 10
1

Кривые руки и Reentrant Lock

21.11.2017, 23:49. Показов 729. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, суть вопроса такова, как изменить данный код, чтобы происходил лок на цикле и последовательность выдавала в нужном порядке от 0 до N :
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
public class Main {
 
    public static void main(String[] args)
    {
        Lock lock=new ReentrantLock();
        ExecutorService service= Executors.newFixedThreadPool(2);
        for (int i=0;i<10;i++)
        {
            lock.lock();
            service.submit(new SomeClass(i));
            lock.unlock();
        }
        service.submit(new OtherClass());
    }
}
public class SomeClass implements Callable {
 
    SomeClass(int i){
        this.i=i;
    }
    private int i;
    @Override
    public Object call() throws Exception {
        System.out.println("Метод call из SomeClass была вызвана "+i+" раз");
        Thread.sleep(1000);
        return "Строка отработала и выдедена из return";
    }
}
 
public class OtherClass implements Runnable{
 
    @Override
    public void run() {
    System.out.println("Отработал run");
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2017, 23:49
Ответы с готовыми решениями:

Swing, Java2D. Нерабочий пример или кривые руки
В общем учусь по книжке Хорстманна и Корнелла. &quot;Java 2. Основы&quot;. Дошёл в процессе обучения до...

Цветомузыка и кривые руки
Всем привет. Предистория: Вообщем захотел я сделать цветомузыку, поскольку знания об электронике...

Searchstart.ru или кривые руки
Проблемка Возникла при скачивании программы и повылезало амиго и прочее Подчистил - вроде ушло...

Кривые руки и домашняя сеть
Всем привет, прошу прошения, за то, что поднимаю эту попсовую тему, но самому не получается...

8
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
22.11.2017, 00:27 2
Цитата Сообщение от Izul Посмотреть сообщение
чтобы происходил лок на цикле и последовательность выдавала в нужном порядке от 0 до N
Какая последовательность?
0
0 / 0 / 0
Регистрация: 19.10.2016
Сообщений: 10
22.11.2017, 10:14  [ТС] 3
Последовательность вызовов submit'ов в цикле
Java
1
2
3
4
5
6
for (int i=0;i<10;i++)
        {
            lock.lock();
            service.submit(new SomeClass(i));
            lock.unlock();
        }
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
22.11.2017, 12:00 4
lock и unlock надо вызывать внутри метода call()
0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
22.11.2017, 22:52 5
Цитата Сообщение от LeX Посмотреть сообщение
lock и unlock надо вызывать внутри метода call()
Как это гарантирует, что поток с инстансом SomeClass(1) вызовет SomeClass::call(), чем поток с инстансом SomeClass(2)?

Izul, я так и не понял, что ты в результате получить-то хочешь?
0
0 / 0 / 0
Регистрация: 19.10.2016
Сообщений: 10
22.11.2017, 23:23  [ТС] 6
Что-то около :
Метод call из SomeClass была вызвана "+1+" раз"
Метод call из SomeClass была вызвана "+2+" раз"
и т.д до 10 с неизменным порядком от 0 до 9 и уже после :"Отработан метод run".
Но пока происходит так, как на пикче. + проверил постановку локов в call, как отписывал Lex
Java
1
2
3
4
5
6
7
8
@Override
    public Object call() throws Exception {
        lock.lock();
        System.out.println("Метод call из SomeClass была вызвана "+i+" раз");
        Thread.sleep(1000);
        lock.unlock();
        return "Строка отработала и выведена из return";
    }
, но это работает примерно никак
Миниатюры
Кривые руки и Reentrant Lock  
0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
23.11.2017, 01:52 7
Цитата Сообщение от Izul Посмотреть сообщение
Что-то около
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.locks.ReentrantLock;
 
public final class SomeShit {
 
    public static void main(String[] args) throws Exception {
        final int n = 10;
        final ExecutorService service = Executors.newFixedThreadPool(2);
        final CompletionService<String> completionService = new ExecutorCompletionService<>(service);
        for (int i = 0; i < n; i++) {
            completionService.submit(new SomeClass());
        }
        final List<String> results = new ArrayList<>(n);
        for (int i = 0; i < n; i++) {
            final Future<String> completedFuture = completionService.take();
            results.add(completedFuture.get());
        }
        results.forEach(System.out::println);
        service.submit(() -> System.out.println("Done"));
        service.shutdown();
    }
}
 
final class SomeClass implements Callable<String> {
 
    private static final ReentrantLock LOCK = new ReentrantLock();
    private static int ID = 0;
 
    @Override
    public String call() throws Exception {
        LOCK.lock();
        ID++;
        final int i = ID;
        System.out.println("Method call() was called " + i + " time(s)");
        LOCK.unlock();
        Thread.sleep(ThreadLocalRandom.current().nextInt(100, 5000));
        return "Method call() #" + i + " completed";
    }
}
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
24.11.2017, 04:59 8
korvin_, как этот код поможет тс? Да, вывод будет в нужном порядке, но суть то другая, вывод должен быть в потоках.

Izul, делай lock в main, а unlock внутри потока
0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
24.11.2017, 09:01 9
Цитата Сообщение от LeX Посмотреть сообщение
Да, вывод будет в нужном порядке, но суть то другая, вывод должен быть в потоках.
А у меня он где? Мой метод call в точности повторяет метод ТС, за исключением внесения счётчика внутрь него, чтобы индексация вызовов call соответствовала порядку, который он хочет.

Добавлено через 20 минут
Если ты про ожидание завершения выполнения всех тасок перед тем как вывести их результаты, то это можно и убрать, сделал просто, чтобы не смешивался вывод сообщений о вызове call и результатов.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import java.util.concurrent.*;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.IntConsumer;
 
public final class SomeShit {
 
    public static void main(String[] args) throws Exception {
        final int n = 10;
        final ExecutorService service = Executors.newFixedThreadPool(2);
        final CompletionService<String> completionService = new ExecutorCompletionService<>(service);
        final Id id = new Id();
        for (int i = 0; i < n; i++) {
            completionService.submit(new SomeClass(id));
        }
        for (int i = 0; i < n; i++) {
            final Future<String> completedFuture = completionService.take();
            System.out.println("\t" + completedFuture.get());
        }
        service.submit(() -> System.out.println("Done"));
        service.shutdown();
    }
}
 
final class SomeClass implements Callable<String> {
 
    private final Id id;
 
    SomeClass(Id id) {
        this.id = id;
    }
 
    @Override
    public String call() throws Exception {
        final int i = id.newId(newId -> System.out.println("Method call() was called " + newId + " time(s)"));
        Thread.sleep(ThreadLocalRandom.current().nextInt(100, 5000));
        return "Method call() #" + i + " completed";
    }
}
 
final class Id {
 
    private final ReentrantLock lock = new ReentrantLock();
    private int currentId = 0;
 
    int newId() {
        lock.lock();
        final int newId = ++currentId;
        lock.unlock();
        return newId;
    }
 
    int newId(IntConsumer newIdConsumer) {
        lock.lock();
        final int newId = ++currentId;
        try {
            newIdConsumer.accept(newId);
        } finally {
            lock.unlock();
        }
        return newId;
    }
}
0
24.11.2017, 09:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2017, 09:01
Помогаю со студенческими работами здесь

Кривые руки, ЕСКД и схема
Добрый день. Пытаюсь освоить мастерство схем по ГОСТу. Уже 2 дня рисую компоненты и правлю схему....

ИЕ 6.0 и таблица, либо кривые руки.. :)
Допустим у меня есть такая вот таблица: +-------------------------------------+ | |1 | ...

Особенности ОСи или руки кривые
Здравствуйте, уважаемые знатоки. У меня возникла проблема с запуском Java под разными ОС. На...

Утилита dd диск hdd и кривые руки
вобщем снес все на диске утилитой dd теперь его система вообще ни как не видит. но виден в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru