Параллельные и серийные потоки
Параллельный поток состоит в том, чтобы разделить контент на несколько блоков данных и обработать поток каждого блока данных отдельно с разными потоками.
Параллельная оптимизация выполняется в Java 8, поэтому мы можем легко управлять данными параллельно. API потока может объявлять декларативно переключаться между параллельными и последовательными потоками через параллельный () и последовательный ().
Понять структуру вилки/соединения
Структура вилки/соединения: при необходимости, большая задача разделена на несколько небольших задач (когда ее нельзя разобрать), а затем результаты выполнения каждой небольшой задачи добавляются вместе.
Разница между структурой вилки/соединения и традиционным пулом потоков:
Используйте режим «Устрова в работе»:
Когда новая задача выполняется, она может разделить ее на меньшие выполнения задач и добавить небольшие задачи в очередь потока, затем украсть один из очереди случайных потоков и поместить в свою очередь.
По сравнению с общей реализацией пула потоков преимущества структуры вилки/соединения отражаются на пути обработки содержащихся в них задач. В общем пуле потоков, если поток выполняет задачу, которая не может продолжать работать по какой -то причине, поток будет в состоянии ожидания. Тем не менее, в реализации Formwork Framework, если подпрограмма не может продолжать работать, потому что она ждет завершения другой подпроблемы. Затем поток, который обрабатывает подпрограмму, будет активно искать другие подзадачи, которые еще не были запускаются для выполнения. Этот метод уменьшает время ожидания потока и повышает производительность.
Импорт java.time.duration; импорт java.time.Instant; import java.util.concurrent.forkjoinpool; import java.util.concurrent.forkjointask; import java.util.concurrent.recursivask; импорт java.util.stream.longstream; xx) {} private static void test1 () {instant start = instant.now (); FORKJOINPOOL POOL = NEW FORKJOINPOOL (); Forkjointask <long> task = new forkjoincalculate (0l, 1000000000l); long sum = pool.invoke (задача); System.out.println (sum); Instant end = instant.now (); System.out.println ("потребительское время"+duture.wedween (start, end) .tomillis ()+"ms"); // потребительское время 3409 мс} частная статическая void test2 () {instant start = instant.now (); Long sum = longstream.rangeclosed (0l, 10000l) .parallel () .reduce (0, long :: sum); System.out.println (sum); Instant end = instant.now (); System.out.println ("время потребления" + duration.weedween (start, end) .tomillis () + "ms"); // Время потребления 2418 мс}} class forkjoincalculate extends recursivetsk <long> {частный последний длинный Long Long Long Start; частный длинный конец; Частный статический последний длинный порог = 2500000000L; // Критическое значение public forkjoincalculate (Long Start, Long End) {this.start = start; this.end = end; } @Override защищен Long Compute () {long Length = end - start; if (длина <= порог) {long sum = 0; для (long i = start; i <= end; i ++) {sum+= i; } return sum; } else {long midne = (start+end)/2; Forkjoincalculate left = new Forkjoincalculate (Start, Middle); left.fork (); Forkjoincalculate right = new forkjoincalculate (middle+1, end); right.fork (); return left.join () + right.join (); }}}Необязательный класс
Необязательный <t> класс (java.util.optional) - это класс контейнеров, который представляет, существует ли значение или не существует.
Оказывается, нулевой означает, что значение не существует, и теперь необязательно может лучше выразить эту концепцию. И это может избежать исключений нулевого указателя.
Общие методы:
Необязательный.of (t t): создать необязательный экземпляр
Необходимый.empty (): создать пустой необязательный экземпляр
Необязательно.
ISpresent (): определяет, включено ли значение
Orelse (t t): Если объект вызова содержит значение, верните значение, иначе возвращает t
ORELSEGEGE (поставщик S): Если объект вызова содержит значение, верните значение, полученное с.
Карта (функция f): если есть значение для его обработки, и возвращает обработанную необязательную, в противном случае она возвращает необязательный. empty ()
Flatmap (функция Mapper): аналогично карте, возвращаемое значение должно быть необязательным
public class optionaltest1 {public static void main (string [] args) {string s = new String ("ha"); // Необязательно <string> op = необязательный. // Необязательно <string> op1 = необязательный Необязательный <string> op1 = необязательный. Офнуллебел (null); // system.out.println (op1.ispresent ()); // system.out.println (op1.orelse (new String ("Google"))); //System.out.println (op1.orelseget (() -> new String ("ali"))); Необязательный <string> op2 = op1.map ((x) -> x.tolowercase ()); String S2 = Op2.get (); System.out.println (S2); }} @Test public void test5 () {man man = new man (); String name = getgodnessname (man); System.out.println (имя); } // Требования: Получите имя богини в человеческой сердце общедоступной строки getgodnessname (человек) {if (man! = Null) {Богу g = man.getgod (); if (g! = null) {return g.getName (); }} вернуть "Учитель Cang"; } // Использовать необязательный класс объектов @test public void test6 () {необязательный <Божественность> Богу = необязательный. Необязательно <newman> op = необязательный. String name = getGodnessName2 (op); System.out.println (имя); } public String getGodnessName2 (необязательный <newman> man) {return man.orelse (new Newman ()) .getgodness () .orelse (новая Богом ("Учитель Cang")) .getName (); } // ПРИМЕЧАНИЕ: Необязательно не может быть сериализованным открытым классом Newman {Private Hogness <Богу> Богу = необязательный. Empty (); частный Божий Бог; Общественный необязательный <Богу> getgod () {return optacto.of (Бог); } public newman () {} public newman (необязательный <Божья> Бога) {this.godness = Богу; } public opportal <Богу> getGodness () {возвращать Богу; } public void setgodness (необязательно <Божье> Богу) {this.godness = Богу; } @Override public String toString () {return "newman [Богу =" + Богу + "]"; }}Выше приведено, что все это опыт использования форкжина и необязательных рамок в Java 8, которые мы собрали для вас. Если вы все еще не понимаете ничего, что не понимаете, когда учитесь, вы можете обсудить это в области сообщений ниже.