Многопоточность с базой данных (mysql или oracle) - PullRequest
3 голосов
/ 05 сентября 2011

Пишу многопоточное приложение, в котором есть несколько потоков (примерно 25), каждый из которых выполняет определенный процесс, а затем обновляет базу данных, в которой затем передается следующему потоку разрешение обрабатывать другой процесс и делать то же самое.По сути, thread1 действительно обрабатывает, а затем обновляет db как завершенную, а когда второй поток считывает db как завершенную, он начинает обработку, и процесс продолжается до потока 25. Кто-нибудь знает, как это возможно в Java?

Ответы [ 4 ]

1 голос
/ 05 сентября 2011

Ваш вопрос невероятно общий, но подход, который я выбрал бы, был бы примерно таким:

  1. назначить одну нить как контроллер нить. Его задача - прослушивать рабочие потоки, чтобы завершить их обработку. Простейший способ сделать это с помощью объекта семафор и методов wait / notify - поток controller будет блокировать семафор а затем позвоните wait.

  2. создайте свои рабочие потоки, каждый со своим собственным семафором объектом, для которого каждый поток получает блокировку и снова вызывает wait.

  3. триггер для запуска обработки (это может быть запущенное приложение, пользователь нажимает кнопку и т. Д.) Получает блокировку контроллера семафор и вызывает notify против этого, пробуждая поток controller . Задача контроллера состоит в том, чтобы выбрать один из рабочих потоков из пула, получить блокировку его семафора и вызов notify, вызывающий пробуждение рабочего. контроллер затем вызывает wait в свой семафор .

  4. рабочий поток может затем прочитать базу данных, выполнить обработку и выполнить обратную запись в базу данных перед вызовом notify на контроллере семафор , вызывающий повторный запуск процесса с контроллером , вызывающим notify на одном из рабочий потоков " семафор с и wait против собственный.

Наконец, предупреждение: это очень краткое описание того, что требуется для реализации общего поведения, которое вы описали. Потоки, возможно, являются наиболее неправильно понятыми темами в компьютерной науке, и очень легко ошибиться. Прежде чем перейти в многопоточную систему, убедитесь, что вы как минимум прочитали Brian Goatz's - Параллелизм Java на практике

1 голос
/ 05 сентября 2011

Вы можете извлекать данные (используя запрос выбора) с простой логикой в ​​каждом потоке, но для обновления данных рекомендуется выполнить запрос в синхронизированном блоке.Поскольку другие потоки зависят от данных, изменяемых этим потоком, это может вызвать проблемы при извлечении записей.

0 голосов
/ 05 сентября 2011

Я не уверен, что полностью выполнил ваши требования, но вот алгоритм высокого уровня:

  1. Создайте необходимое количество потоков и поместите их в массив.

  2. Теперь, начиная со второго потока до последнего, каждый поток должен выполнить join() в предыдущем потоке; это будет способствовать тому, что каждая команда выполняет свою часть обработки и обновления после завершения своей предыдущей работы.

Возможный код:

Объявление класса потока

class WaitingThread extends Thread
{    
    private Thread previousThread;

    public WaitingThread(final Thread previous)
    {
        this.previousThread = previous;
    }

    public void run()
    {
        doParallelTask();

        if(previousThread != null)
        {
             previousThread.join();
        }

        doProcesingAndUpdating();
    }
}

Объявление и инициализация массива;

    final Thread [] threads = new Thread[25];

    for(int i = 0; i < 25; i++)
    {
        if(i == 0)
        {
            threads[i] = new WaitinThread(null);
        }
        else
        {
            threads[i] = new WaitingThread(threads[i - 1]);
        }
    }

Надеюсь, это поможет.

PS: Должен признать, что в приведенной выше модели имеет смысл сделать doParallelTask(), используя несколько потоков, и сделать 25 doProcessingAndUpdate(), используя один поток.

0 голосов
/ 05 сентября 2011

Почему именно 25?

В любом случае, то, что вы говорите, безусловно возможно, но вы можете создать специальный поток, который будет получать результирующее значение, вычисленное каждым потоком, и отправлять его в базу данных.

Таким образом, у вас должен быть один поток, который может обращаться к базе данных, а все остальные потоки не должны ждать базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...