Transmisiones paralelas y en serie
Una secuencia paralela es dividir un contenido en múltiples bloques de datos y procesar la secuencia de cada bloque de datos por separado con diferentes hilos.
La optimización paralela se realiza en Java 8, por lo que podemos operar fácilmente los datos en paralelo. La API de la corriente puede cambiar declarativamente entre las transmisiones paralelas y secuenciales a través de paralelo () y secuencial ().
Comprender el marco de la bifurcación/unión
Marco de la bifurcación/unión: cuando es necesario, una tarea grande se divide en varias tareas pequeñas (cuando no se puede desmontar), y luego se suman los resultados de la ejecución de cada tarea pequeña.
La diferencia entre el marco de la bifurcación/unión y el grupo de hilos tradicional:
Utilice el modo "robo de trabajo":
Cuando se ejecuta una nueva tarea, puede dividirla en ejecuciones de tareas más pequeñas y agregar pequeñas tareas a la cola de subprocesos, luego robar una de una cola de hilos aleatorios y ponerlo en su propia cola.
En comparación con la implementación general del grupo de hilos, las ventajas del marco de la horquilla/unión se reflejan en la forma del manejo de las tareas contenidas en el mismo. En el grupo de hilo general, si un hilo está ejecutando una tarea que no puede continuar ejecutándose por alguna razón, el hilo estará en un estado de espera. Sin embargo, en la implementación del marco de la bifurcación/unión, si un subproblema no puede continuar funcionando porque está esperando la finalización de otro subproblema. Luego, el hilo que maneja el subproblema buscará activamente otros subproblemas que aún no se han ejecutado para la ejecución. Este método reduce el tiempo de espera del hilo y mejora el rendimiento.
import java.time.duration; import java.time.instant; import java.util.concurrent.forkjoinpool; import java.util.concurrent.forkJoinTask; import java.util.concurrent.recursiveTask; import java.util.stream.longstream; public class testforkJoin {pública static stat []; xx) {} private static void test1 () {instant start = instant.now (); Forkjoinpool Pool = nuevo Forkjoinpool (); ForkJoNkAsk <Long> tarea = nueva ForkJoIncalculate (0L, 1000000000L); Long Sum = Pool.Invoke (tarea); System.out.println (suma); Instant final = instant.now (); System.out.println ("Tiempo de consumo"+Duración.between (Start, End) .tomillis ()+"MS"); // Consum Time 3409ms} private estático void test2 () {instant start = instant.now (); Larga suma = longstream.rangeclosed (0l, 10000l) .parallel () .reduce (0, long :: sum); System.out.println (suma); Instant final = instant.now (); System.out.println ("Tiempo de consumo" + duración.between (inicio, final) .tomillis () + "ms"); // tiempo de consumo 2418MS}} clase de la clase de la clase extiende recursiveTask <largo> {private estático final estático extremo largo privado; umbral largo de la estática privada final = 250000000000L; // Valor crítico Public forkJoincalculated (Long Start, Long End) {this.Start = Start; this.end = end; } @Override Proteged Long Compute () {Long longitud = End - Start; if (longitud <= umbral) {long sum = 0; para (long i = start; i <= end; i ++) {sum+= i; } suma de retorno; } else {Long Middle = (Start+End)/2; ForkJoincalcule Left = New ForkJoincalcule (Start, Middle); izquierda.fork (); ForkJoincalcule Right = New ForkJoincalcule (Middle+1, End); right.fork (); return left.Join () + right.Join (); }}}Clase opcional
La clase <t> opcional (java.util.optional) es una clase de contenedor que representa si un valor existe o no existe.
Resulta que NULL significa que no existe un valor, y ahora opcional puede expresar mejor este concepto. Y puede evitar excepciones de puntero nulo.
Métodos comunes:
Opcional.of (t t): cree una instancia opcional
Opcional.empty (): cree una instancia opcional vacía
Opcional.ofnullable (t t): si t no es nulo, cree una instancia opcional, de lo contrario crear una instancia vacía.
isPresent (): determina si el valor está incluido
orelse (t t): si el objeto de llamada contiene un valor, devuelva el valor, de lo contrario devolver t
orelseget (proveedor s): si el objeto de llamada contiene un valor, devuelva el valor obtenido por s.
Mapa (función f): si hay un valor para procesarlo y devuelve el opcional procesado, de lo contrario, devuelve opcional.empty ()
FlatMap (Function Mapper): similar al mapa, el valor de retorno debe ser opcional
Clase pública OppectionAtalT1 {public static void main (string [] args) {String s = new String ("ha"); // opcional <string> op = opcional.of (null); // // string s1 = op.get (); // system.out.println (s1); // Opcional <String> OP1 = Opcional.Empty (); // String S1 = OP1.Get (); // System.out.println (S1); Opcional <String> OP1 = Oppectional.OfNullable (NULL); // System.out.println (OP1.IsPresent ()); // System.out.println (op1.orelse (nueva cadena ("Google"))); //System.out.println (op1.orelseget (() -> new String ("Ali"))); Opcional <String> op2 = op1.map ((x) -> x.tolowercase ()); Cadena s2 = op2.get (); System.out.println (S2); }} @Test public void test5 () {man man = new Man (); Name de cadena = getGodnessName (hombre); System.out.println (nombre); } // Requisitos: Obtenga el nombre de la Diosa en la cadena pública del corazón de un hombre GetGodnessName (Man Man) {if (Man! = Null) {Dios G = Man.getGod (); if (g! = null) {return g.getName (); }} return "profesor cang"; } // use la clase de entidad opcional @test public void test6 () {Opcional <Dioscaldad> Dios. Opcional <NEWMAN> OP = OPTIONAL.OFNULLABLE (New Newman (DIGNness)); Name de cadena = getGodnessName2 (op); System.out.println (nombre); } public String getGodnessName2 (Opcional <NEWMAN> MAN) {return man.orelse (new Newman ()) .getGodness () .orelse (New Digness ("Profesor CANG")) .getName (); } // NOTA: Opcional no se puede serializar la clase pública Newman {privado Opcional <Dioscaldad> DIGNness = Opcional.Empty (); Dios de la diosa privada; Public Opcional <DeWlness> getGod () {return Oppectional.of (dios); } public newman () {} public Newman (Opcional <Dioscaldad> Diegidad) {this.godness = DIGNness; } public Opcional <DeWlness> getGodness () {return Dios; } public void setGodness (opcional <Diosilidad> dividumbre) {this.godness = diosness; } @Override public String toString () {return "Newman [Godness =" + Godness + "]"; }}Lo anterior es toda la experiencia de usar los marcos Forkjoin y opcionales en Java 8 que hemos compilado para usted. Si aún no comprende nada que no comprenda cuando está aprendiendo, puede discutirlo en el área de mensajes a continuación.