Fluxos paralelos e em série
Um fluxo paralelo é dividir um conteúdo em vários blocos de dados e processar o fluxo de cada bloco de dados separadamente com encadeamentos diferentes.
A otimização paralela é realizada no Java 8, para que possamos operar facilmente os dados em paralelo. A API do fluxo pode alternar declarativamente entre fluxos paralelos e seqüenciais através de paralelo () e sequencial ().
Entenda a estrutura do garfo/junção
Forek/Junção da estrutura: Quando necessário, uma grande tarefa é dividida em várias pequenas tarefas (quando não pode ser desmontada) e, em seguida, os resultados da execução de cada pequena tarefa são adicionados.
A diferença entre a estrutura do garfo/junção e o pool de threads tradicional:
Use o modo de "roubo de trabalho":
Quando uma nova tarefa é executada, ela pode dividi -la em execuções de tarefas menores e adicionar pequenas tarefas à fila do encadeamento, roubar uma de uma fila de threads aleatórios e colocá -la em sua própria fila.
Comparado com a implementação geral do pool de threads, as vantagens da estrutura do garfo/junção são refletidas na maneira de lidar com as tarefas nela contidas. No pool de threads em geral, se um thread estiver executando uma tarefa que não possa continuar a ser executada por algum motivo, o thread estará em um estado de espera. No entanto, na implementação da estrutura de bifurcação/junção, se um subproblema não puder continuar a ser executado porque está aguardando a conclusão de outro subproblema. Em seguida, o tópico que lida com o subproblema procurará ativamente outros subproblemas que ainda não foram executados para execução. Este método reduz o tempo de espera do encadeamento e melhora o desempenho.
importar java.Time.Duration; importar java.Time.Instant; importar java.util.concurrent.forkjoinpool; importar java.util.concurrent.ForkJointask; importação java.util.Concurrent.RecurS.TerTask; import Java.util.Stream.LongSamamamamamamEdn; xx) {} private estático void test1 () {instant start = instant.now (); Pool de forkjoinpool = new ForkJoinpool (); Forkjointask <long> tarefa = new forkjoincalculate (0L, 1000000000L); soma longa = pool.invoke (tarefa); System.out.println (soma); End instantâneo = instant.now (); System.out.println ("tempo de consumo"+duração. Soma longa = longstream.rangeClosed (0L, 10000L) .parallel () .Reduce (0, long :: sum); System.out.println (soma); End instantâneo = instant.now (); System.out.println ("tempo de consumo" + duração. Private Long End; limite final estático privado = 2500000000L; // Valor crítico public forkjoincalculate (start long start, long end) {this.start = start; this.end = end; } @Override Protected long compute () {comprimento longo = end - start; if (comprimento <= limite) {long sum = 0; para (longo i = start; i <= end; i ++) {sum+= i; } retornar soma; } else {Long Middle = (Start+End)/2; Forkjoincalculate à esquerda = new forkjoincalculate (start, meio); esquerd.fork (); Forkjoincalculate à direita = new forkjoincalculate (meio+1, final); certo.fork (); retornar esquerda.Join () + Right.Join (); }}}Classe opcional
Classe <T> opcional (java.util.optional) é uma classe de contêiner que representa se existe ou não existe um valor.
Acontece que nulo significa que um valor não existe e agora opcional pode expressar melhor esse conceito. E pode evitar exceções nulas de ponteiro.
Métodos comuns:
Opcional.of (t t): Crie uma instância opcional
Opcional.empty (): Crie uma instância opcional vazia
Opcional.ofnullable (t t): Se t não for nulo, crie uma instância opcional, caso contrário, crie uma instância vazia.
ispresent (): determina se o valor está incluído
ORELSE (T T): Se o objeto de chamada contiver um valor, retorne o valor, caso contrário, retorne t
ORELSEGET (Fornecedor S): Se o objeto de chamada contiver um valor, retorne o valor obtido por S.
mapa (função f): se houver um valor para processá -lo e retornar o processado opcional; caso contrário, ele retorna opcional.Empty ()
Flatmap (Função Mapper): Semelhante ao mapa, o valor de retorno deve ser opcional
public class OptionAlTest1 {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 = opcional.ofnullable (null); // system.out.println (op1.ispresent ()); // System.out.println (op1.orelse (new String ("google"))); //System.out.println (op1.orelseget (() -> new String ("Ali"))); Opcional <string> op2 = op1.map ((x) -> x.tolowerCase ()); String s2 = op2.get (); System.out.println (S2); }} @Test public void test5 () {homem man = new Man (); Nome da string = getGodnessName (homem); System.out.println (nome); } // Requisitos: Obtenha o nome da deusa no coração de um homem public string getgodnessname (homem homem) {if (homem! = Null) {dility g = man.getgod (); if (g! = null) {return g.getName (); }} retornar "Professor Cang"; } // Use a classe de entidade opcional @test public void test6 () {opcional <ilendness> gilless = opcional.ofnullable (nova dica ("lin chiling")); Opcional <wenman> op = opcional.ofnullable (New Newman (Deus)); Nome da string = getGodnessName2 (op); System.out.println (nome); } public string getGodnessName2 (opcional <wenman> homem) {return man.orelse (new Newman ()) .getGodness () .orelse (nova dilização ("professor cang") .getName (); } // Nota: Opcional não pode ser serializado classe pública Newman {Private Opcional <ERDENDESS> GODNESS = OPCIONAL.EMPTY (); Deus de Deus particular; public Opcional <ierness> getGod () {return opcional.of (Deus); } public newman () {} public newman (opcional <ierness> sumidiridade) {this.godness = Gilidade; } public Opcional <iGeness> getGodness () {retornar a dica; } public void Setgodness (opcional <diodness> sumidiridade) {this.godness = GIDENDE; } @Override public string tostring () {return "Newman [GODNESS =" + GODNESS + "]"; }}O exposto acima é toda a experiência de usar o Forkjoin e as estruturas opcionais em Java 8 que compilamos para você. Se você ainda não entende nada do que não entende quando está aprendendo, pode discutir isso na área de mensagens abaixo.