- Get link
- Other Apps
- Get link
- Other Apps
Работая с большими проектами часто сталкиваюсь с проблемами загруженности БД, и в один прекрасный день поступил заказ который надо было создать отдельный раздел статистик где генерировался отчет по покупкам, отчет должен был состоять из трех частей (блоков), полный отчет, отчет 10 последних покупок и 5 покупок в случном порядке. Это все должно было быть в одной странице. Собственно сама проблема состоит в том, что запросы обрабатываются в среднем 20-30 сек, это связанно с загруженностью БД с 2 млн. данными, и для каждого блока примерно уходит 20 сек, общее получается более минуты.
Надо отметить что все потоковые объекты берутся с пакета java.util.concurrent.
Рассмотрим другую реализацию executors - Исполнители.
Именно его рекомендуют использовать в версиях SE5/SE6.
public class MultiThreadets {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new TestPotok());
exec.shutdown();
System.out.println("DONE");
}
}
Мы видим что объект ExecutorService создает контекст для интерфейса Runnable создавая отдельный поток для каждой задачи. Поток будет существовать и выполняться до вызова метода exec.shutdown();
Возникла идея добавить обработку каждого блока в отдельные потоки.
Рассмотрим какие потоки существуют в Java версии 5/6. Что из себя представляет поток (thread), не надо путать поток с потоком данных I/O(stream) это разные вещи, проще говоря это задачи не зависящее друг от друга, выполнения этих задач происходит параллельным образом. Таким образом возрастает скорость выполнения программы выводя его в качественный продукт.
Задачи.
Программный поток представляет некую задачу и операцию, чтобы определить задачу необходимо реализовать интерфейс Runnable с методом run().
public class MultiThreadets {
public static void main(String[] args) {
Thread tr=new Thread(new TestPotok);
tr.start();
Thread tr=new Thread(new TestPotok);
tr.start();
System.out.println("DONE");
}
}
public class TestPotok implements Runnable{
public void letsGo() throws InterruptedException {
Thread.sleep(5000);
System.out.println("OK");
}
public void run() throws InterruptedException {
letsGo();
}
}
В задаче видно операция делиться на два потока, класс TestPotok имплементирует интерфейс Runnable который определяет потоковые операции, для наглядности отправляем класс TestPotok в спячку на 5 сек. в то время как main класс будет выполняться в собственном потоке.
в результате мы получим
output:
DONE
OK
В задаче видно операция делиться на два потока, класс TestPotok имплементирует интерфейс Runnable который определяет потоковые операции, для наглядности отправляем класс TestPotok в спячку на 5 сек. в то время как main класс будет выполняться в собственном потоке.
в результате мы получим
output:
DONE
OK
Единственный недостаток данного метода то, что поток выполняется бесконечно т.е. метод run() представляет собой как цикличный процесс,
Надо отметить что все потоковые объекты берутся с пакета java.util.concurrent.
Рассмотрим другую реализацию executors - Исполнители.
Именно его рекомендуют использовать в версиях SE5/SE6.
public class MultiThreadets {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new TestPotok());
exec.shutdown();
System.out.println("DONE");
}
}
Мы видим что объект ExecutorService создает контекст для интерфейса Runnable создавая отдельный поток для каждой задачи. Поток будет существовать и выполняться до вызова метода exec.shutdown();
Comments
Post a Comment