Предыдущие сообщения в блоге в основном суммировали некоторый контент в параллелизме Java. Этот пост в блоге в основном начинается с проблемы и посмотрите, какие технологии параллелизма, обобщенные выше, могут быть использованы для их решения.
Моделируйте сценарий: обработка 16 записей журнала, каждая запись записи журнала занимает 1 секунду. При нормальных обстоятельствах, если эти 16 записей завершены, это займет 16 секунд. Чтобы повысить эффективность, мы готовы начать 4 потока для печати и распечатать их за 4 секунды, чтобы реализовать эту демонстрацию.
Давайте сначала проанализируем этот вопрос. Что касается этих 16 записей журнала, мы можем сгенерировать их в основном потоке. Это не сложно. Ключ должен запустить 4 потока для выполнения. Теперь есть две идеи: одна из них заключается в том, что генерация журналов и поток, который печатает журналы, логически разделены; Другое заключается в том, что генерация журналов и поток, который печатает журналы, логически не разделены. Это может быть немного неясно. Позвольте мне написать реализованную демонстрацию на основе этих двух идей.
Генерация журналов и печать журнала логически разделены.
Это эквивалентно двум фронтам: один фронт постоянно генерирует журналы, а другой - постоянно печатать журналы. Очевидно, что вы подумаете об использовании блокирующих очередей и генерируют журналы, которые продолжают подключаться к очереди блокировки, и печатать журналы, которые продолжают получать от очередей блокировки. Размер блокировки может быть установлен самостоятельно, 16 или 1, что не влияет на выполнение. Таким образом, будет использоваться Blockingqueue, давайте посмотрим на демонстрацию, реализованную ниже:
Public Class Practice1 {public static void main (string [] args) {// Определить очередь блокировки, размер очереди может содержать 16 информаций Blockingqueue <string> queue = new Arrayblockqueue <string> (16); для (int i = 0; i <4; i ++ {// Откройте Four Threads, чтобы заблокировать QueUe, чтобы получить новую тему (New Runnable () {// Откройте Four Threads, чтобы заблокировать QueUe, чтобы получить новую тему (newnable (). run () {while (true) {try {string log = queue.take (); // Получить log parselog (log); // print log} catch (urrupteDexcept e) {// todo автоматически генерируется слок. (System.currentTimeMiMillis ()/1000)); for (int i = 0; i <16; i ++) {final String log = "" +(i +1); // Укажите log try {queue.put (log); // subt aut-queue queue} (log); // to-aut-quercectored ate-chearcection eathception e) blocke.printstacktrace ();}}} public static void parselog (String log) {// Метод для печати системы журнала. Second} catch (прерывание Exception e) {// todo Auto Generated Catch Blocke.printStackTrace ();}}}} Это похоже на работу системы, постоянно генерируя журналы и постоянно открывая несколько потоков для печати информации журнала. Демонстрация написана, и результат операции не опубликован.
Генерация журналов и печать журнала не логически разделены.
Эта идея в том, что когда я генерирую журнал, вы распечатываете его для меня и делаете это с четырьмя потоками вместе! Так что, если вы так думаете, вы должны использовать пул потоков. Сначала я создал пул потоков, который содержал 4 потока, а затем, когда журнал был сгенерирован, я попросил пул потоков использовать поток для его выполнения. Демонстрация заключается в следующем:
Public Class Practice1 {public static void main (string [] args) {executorservice service = executors.newfixedthreadpool (4); // Создать систему пула потоков. service.execute (new Runnable () {// возьмите поток, чтобы выполнить @override public void run () {parselog (log);}});} service.shutdown (); // Не забудьте выключить пул потоков в конце} public void parselog (string log) {system.out.println (thinkrrentthreck () gate-log () gatename () gate-negrade (). «---» + (System.currentTimeMillis ()/1000)); Try {thread.sleep (1000); // Моделирование печати журнала требует 1 секунду} catch (urruptException e) {// todo Автогенерированный лоткий блок.Давайте обобщу эту проблему здесь. Если вы понимаете эти две идеи, вы обычно можете их эффективно решить.
Выше приведено все содержание этой статьи о Java программировать многопоточный пример проблемного примера, я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!