Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточная работа с базой 
:(
    Опции темы
CSharpProgrammer
Дата 12.8.2011, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 6.7.2006

Репутация: нет
Всего: нет



Доброго времени суток.

Возникла задача, есть класс содержащий метод который выполняет проверку. Данные проверки берутся из таблицы в бд (запись в таблице). Необходимо многопоточно выполнять проверку, так чтобы каждый поток брал свою запись из базы последовательно. Как бы это реализовать используя возможности 5 версии Java (т.е. используя настраиваемый пулл потоков) и какой-нибудь embedded базы (без запуска сервера) может быть используя lucene..

С Потоками еще не работал, поэтому хотелось бы детальный пример.
PM MAIL   Вверх
Stolzen
Дата 14.8.2011, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Используйте ThreadPool. Пример:

Код

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


enum SomeResource {
    INSTANCE;
    
    private int count = 0;
    
    public int getCounter() {
        return ++count;
    }
}

class Process implements Runnable {
    private int position;

    public Process(int position) {
        this.position = position;
    }
    
    @Override
    public void run() {
        Random rnd = new Random();
        final int wait = rnd.nextInt(1000);
        System.out.println(this.position + ") Using resource #" + SomeResource.INSTANCE.getCounter() + 
                "; Waiting " + wait);
        try {
            Thread.sleep(wait);
        } catch (InterruptedException e) {
        }
    }
}

public class Manager {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(5);
        
        for (int i = 0; i < 20; ++i) {
            executor.submit(new Process(i + 1));
        }
        
        executor.shutdown();
    }
}


Вывод:
Код

1) Using resource #1; Waiting 80
2) Using resource #2; Waiting 313
3) Using resource #3; Waiting 517
4) Using resource #4; Waiting 466
5) Using resource #5; Waiting 121
6) Using resource #6; Waiting 485
7) Using resource #7; Waiting 382
8) Using resource #8; Waiting 188
9) Using resource #9; Waiting 225
10) Using resource #10; Waiting 104
11) Using resource #11; Waiting 874
12) Using resource #12; Waiting 948
13) Using resource #13; Waiting 170
14) Using resource #14; Waiting 900
15) Using resource #15; Waiting 466
16) Using resource #16; Waiting 654
17) Using resource #17; Waiting 345
18) Using resource #18; Waiting 703
19) Using resource #19; Waiting 866
20) Using resource #20; Waiting 980


Из вывода видно, что каждый поток взял себе именно тот ресурс, который ему был предназначен


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Старовъръ
Дата 14.8.2011, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 4
Всего: 10



Цитата
Необходимо многопоточно выполнять проверку, так чтобы каждый поток брал свою запись из базы последовательно.
Ну ты определись что ли - последовательно тебе нужно или параллельно smile 
Если расскажешь зачем тебе это нужно, возможно найдется у кого-то совет как преобразовать твой алгоритм во что-то более эффективное.
PM MAIL WWW   Вверх
CSharpProgrammer
Дата 15.8.2011, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 6.7.2006

Репутация: нет
Всего: нет



Stolzen спасибо за код, это как раз то что мне нужно! Тогда у меня еще один вопрос если я делаю так
Код

for (int i = 0; i < 10000000; ++i) {
        executor.submit(new Process(i + 1));
}

то у меня вылетает
Код

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

можно как-то сделать, чтобы пока какой-то поток из пула не закончил свою работу, другие потоки не создавались?

Старовъръ, Задача в следующем заключается: в таблице есть записи вида
1) адрес сайта, 
2) ссылка, 
3) дата последней проверки
Необходимо проверить наличие ссылки на сайте если дата последней проверки больше чем пол года. И все это должно делаться многопоточно.

PM MAIL   Вверх
Старовъръ
Дата 15.8.2011, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 4
Всего: 10



Тогда зачем читать последовательно? Выгребаешь каждый раз по 100 записей, выстраиваешь в очередь и отдаешь на растерзание потокам (по схеме, которую описал Stolzen). Затем обратно записываешь те же 100 и повторяешь процедуру наново. Так производительность будет намного выше, нежели при последовательном чтении по одной записи.
PM MAIL WWW   Вверх
CSharpProgrammer
Дата 15.8.2011, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 6.7.2006

Репутация: нет
Всего: нет



Цитата(Старовъръ @ 15.8.2011,  00:42)
Тогда зачем читать последовательно? Выгребаешь каждый раз по 100 записей, выстраиваешь в очередь и отдаешь на растерзание потокам (по схеме, которую описал Stolzen). Затем обратно записываешь те же 100 и повторяешь процедуру наново. Так производительность будет намного выше, нежели при последовательном чтении по одной записи.

Спасибо, я понял уже что этот вариант правильный, но как сделать все таки так
Код

for (int i = 0; i < 10000000; ++i) {
        executor.submit(new Process(i + 1));
}

чтобы не вылетало java.lang.OutOfMemoryError: Java heap space ?
PM MAIL   Вверх
Stolzen
Дата 15.8.2011, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Цитата(CSharpProgrammer @  15.8.2011,  02:14 Найти цитируемый пост)
Спасибо, я понял уже что этот вариант правильный, но как сделать все таки так
for (int i = 0; i < 10000000; ++i) {
        executor.submit(new Process(i + 1));
}

чтобы не вылетало java.lang.OutOfMemoryError: Java heap space ? 

10 млн тредов уж очень много памяти сожрут - тут уж как не увеличивай доступную для jvm память, ошибка все равно будет. 

В вашем случае можно попробовать использовать ThreadPoolExecutor + кастомный ThreadFactory.


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
CSharpProgrammer
Дата 15.8.2011, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 6.7.2006

Репутация: нет
Всего: нет



Цитата(Stolzen @ 15.8.2011,  09:00)
10 млн тредов уж очень много памяти сожрут - тут уж как не увеличивай доступную для jvm память, ошибка все равно будет. 

В вашем случае можно попробовать использовать ThreadPoolExecutor + кастомный ThreadFactory.

Спасибо, буду разбираться!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.