Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Thread/ ReentrantLock / 15 сообщений из 15, страница 1 из 1
15.03.2014, 18:57
    #38587211
alex021
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
Добрый вечер.
Есть следующая структура
класс с потоками
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class ThreadStorage{
//есть список потоков
LinkedList<MyThread> list = new LinkedList<>();

//какой-то метод который по очереди их запускает

public void startThreadList(){
 for (int i = 0; i < list.size(); i++) {
     list.get(i).start();
}
}


ну и класс с ресурсами
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
сlass Resourse(
   private Lock lock = new ReentrantLock();
       public void getResourse(){
            lock.lock();
               try{
               //пытается получить какой-то ресурс, или что-то сделать
            }finally{
              lock.unlock
            }
}


ну и класс MyThread вот такой например
Код: java
1.
2.
3.
4.
5.
6.
class MyThread extends Thread(
   public void run(){
     Resource res = new Resourse();
     res.getResource();
   }
}



Вопрос собственно такой : может ли этот код гарантировать то, что ресурс будет захвачен поочереди потоками из " list" в том порядке в котором они находятся там.
То есть сначала первый поток захватит, потом второй, потом третий и тд.

И если нет, то как можно этого добиться? без использования блокирующих очередей из готовой библиотеки?
...
Рейтинг: 0 / 0
15.03.2014, 19:10
    #38587213
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
ИМХО, если сделать Resource синглтоном , то да.
...
Рейтинг: 0 / 0
15.03.2014, 19:20
    #38587217
alex021
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
Спасибо =)
то бишь просто поочередным запуском не обеспечивается необходимый порядок?
может быть еще кто-нибудь посоветует что?
...
Рейтинг: 0 / 0
15.03.2014, 19:54
    #38587238
alex021
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
хотя я тут посидел прикинул и не совсем понял, как тут синглтон поможет
...
Рейтинг: 0 / 0
15.03.2014, 19:54
    #38587239
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
alex021И если нет, то как можно этого добиться?
Код: java
1.
2.
3.
4.
for (int i = 0; i < list.size(); i++) {
    list.get(i).start();
    list.get(i).join();
}
...
Рейтинг: 0 / 0
15.03.2014, 20:06
    #38587244
alex021
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
Usman,

да, спасибо=) я тоже об жито подумал, только делал немного по другому.
Код: java
1.
2.
3.
4.
for (int i = 0; i < list.size(); i++) {
    list.get(i).start();
    Thread.sleep(50);
}



Но это на мой взгляд лишь, так сказать "затычка" =( качественной работы не обеспечит.
...
Рейтинг: 0 / 0
15.03.2014, 20:13
    #38587247
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
alex021,

ИМХО. Синглтон поможет тем, что у Вас для каждого потока создается свой экземпляр Resource со своим же внутренним ReentrantLock. Как вариант запихнуть ReentrantLock в статичное поле (как вариант - проверить и тд). А чтобы последовательно выполнялись:
авторThe constructor for this class accepts an optional fairness parameter. When set true, under contention, locks favor granting access to the longest-waiting thread.
Итого:

Код: java
1.
private final static ReentrantLock lock = new ReentrantLock(true);
...
Рейтинг: 0 / 0
15.03.2014, 20:27
    #38587253
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
alex021,

Еще один вариант:
Код: java
1.
2.
3.
4.
5.
ExecutorService executor = Executors.newSingleThreadExecutor();
for (int i = 0; i < list.size(); i++) {
    executor.execute(list.get(i));
}		
executor.shutdown();
...
Рейтинг: 0 / 0
15.03.2014, 20:52
    #38587266
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
alex021Спасибо =)
то бишь просто поочередным запуском не обеспечивается необходимый порядок?
может быть еще кто-нибудь посоветует что?Нет, порядок гарантирован не будет.
И Thread.sleep() вам тоже никаких гарантий не даст, так как ХЗ в каком порядке они на самом деле проснуться.
И ReentrantLock с fair=true вам не поможет, так как хз в каком порядке потоки встанут в очередь внутри ReentrantLock.
И ExecutorService вам так же не поможет ... так как он вооб

Executors.newSingleThreadExecutor() и Thread.join() - да, помогут. Но тогда весь смысл многопоточности теряется, ибо по сути у вас в бэкгрануде всегда будет только один поток.

Ну и, ко всему прочему, ваш код некорректен, так как каждый поток создает свой инстанс Resource.

Если хотите гарантировать порядок, то вам нужно создать какую-то явную связь между потоками. Например, у каждого потока сидит внутри поле new CountDownLatch(1). Второй поток слушает латч первого потока, третий второго, и т.д.. Потом первый поработал с ресурсом, отпустил латч, второй начал работать. Потом второй отпустил, третий начал работать, и т.д.
...
Рейтинг: 0 / 0
15.03.2014, 21:21
    #38587286
alex021
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
no56892, да с конструктором вроде стало работать стабольно
но вот человек тут раскидал все идеи).
Usman , про экзекьютор согласен, как-то не тянет на много поточность. Хотя спасибо за совет , порылся поинтересовался этим)
...
Рейтинг: 0 / 0
15.03.2014, 21:22
    #38587289
alex021
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
DEVcoachЕсли хотите гарантировать порядок, то вам нужно создать какую-то явную связь между потоками. Например, у каждого потока сидит внутри поле new CountDownLatch(1). Второй поток слушает латч первого потока, третий второго, и т.д.. Потом первый поработал с ресурсом, отпустил латч, второй начал работать. Потом второй отпустил, третий начал работать, и т.д.


Идею я понял, но как организовать прослушку, связав потоки..эмм ..честно говоря я в тупике =( на мысль не натолкнете?
...
Рейтинг: 0 / 0
15.03.2014, 22:10
    #38587307
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
alex021 ,
Не берусь утверждать, что это самое красивое, и лучшее решение, просто первое, что пришло в голову.
Код: 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.
Resource res = new Resource();

LinkedList<MyThread> list = new LinkedList<>();

CountDownLatch prevLatch = null;

for (...) {
    MyThread thread = new MyThread(res, prevLatch);
    
    list.add(thread);

    prevLatch = thread.latch;
}

class MyThread extends Thread {
    private final Resource res;
    private final CountDownLatch prevLatch;
    private final CountDownLatch latch = new CountDownLatch(1);

    public MyThread(Resource res, CountDownLatch prevLatch) {
        this.res = res;
        this.prevLatch = prevLatch;
    }

    public void run() {
        if (prevLatch) != null
            prevLatch.await();

        res.getResource();
        
        latch.countDown();

        ...
    }
}
...
Рейтинг: 0 / 0
16.03.2014, 01:53
    #38587364
alex021
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
DEVcoach alex021 ,
Не берусь утверждать, что это самое красивое, и лучшее решение, просто первое, что пришло в голову.
[/src]
спасибо! идея дошла . посидел , вроде работает =)
Тема закрыта.
...
Рейтинг: 0 / 0
16.03.2014, 11:36
    #38587414
vimba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
alex021,

а зачем тут несколько потоков если в один момент времени может выполняться только один, может лучше всё в один поток делать?
...
Рейтинг: 0 / 0
16.03.2014, 12:41
    #38587439
alex021
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thread/ ReentrantLock
vimba,
задание "обуздать потоки" =))
ограничив доступ к ресурсу, и ограничив время, которое потоки хотят ждать этот ресурс, по истечению которого поток отключается.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Thread/ ReentrantLock / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]