1. Executores
A classe Executores pode ser considerada uma "classe de ferramentas". Citando a introdução na API JDK1.6:
Métodos de fábrica e práticos do Executor, ExecutorService, ScheduleDexecutorService, ThreadFactory e Classes Callable definidas neste pacote. Esta classe suporta vários métodos:
(1) Crie e retorne o método de definir o ExecorService com seqüências de configuração comumente usadas.
(2) Crie e retorne o método de definir o ScheduleDexecutorService com seqüências de configuração comumente usadas.
(3) Crie e retorne o método "embrulhado" ExecorService, que desativa a reconfiguração, tornando inacessíveis os métodos específicos da implementação.
(4) Crie e retorne um método de ThreadFactory, que pode definir o thread recém -criado como um estado conhecido.
(5) Crie e retorne um método chamável não fechado, para que possa ser usado em métodos de execução que requerem chamadas.
Através desta classe, você pode obter várias instâncias de pools de threads, como chamar o NewsingLethReadExecutor () para obter um executores de thread único, chamando newFixedThreadpool () para obter um serviço de executores de um conjunto de threads de tamanho fixo, etc. Há mais coisas que você pode fazer quando você obtém o serviço de executores. O mais fácil é usá -lo para executar objetos executáveis, ou você pode executar alguns objetos que implementam <T>. Não há valor de retorno usando o método start () do thread. Se o método executado pelo thread tiver um valor de retorno, seria melhor usar o ExecorService. Você pode escolher submeter (), InvoKeAll () ou Invokeany () e selecionar o método apropriado de acordo com a situação específica.
Alguns dos métodos fornecidos nesta classe são:
1.1 Public Static ExecorService NewCachedThreadpool ()
Crie um pool de threads que crie novos threads conforme necessário, mas reutiliza -os quando threads construídos anteriormente estiverem disponíveis. Esses pools de threads geralmente melhoram o desempenho do programa para programas que executam muitas tarefas assíncronas de curto prazo.
1.2 Public Static ExecorService NewFixedThreadpool (int nthreads)
Crie um pool de threads com um número fixo de threads reutilizáveis para executar esses threads em uma fila compartilhada.
1.3 Public Static ExecorService NewsingleThreadExecutor ()
Crie um executor que use um único thread trabalhador para executar o thread em uma fila ilimitada.
Todos os três métodos podem ser usados com instâncias de interface ThreadFactory. E retorne uma instância da interface ExecutorService.
2. Interface ThreadFactory
Crie novos objetos de thread, conforme necessário. O uso de fábricas de threads não requer mais a escrita manual de novas chamadas de threads, permitindo que os aplicativos usem subclasses, propriedades etc.
A implementação mais simples desta interface é:
classe SimpleThReadFactory Iplementos threadFactory {public Thread Newthread (Runnable r) {return New Thread (r); }} 3. Interface ExecorService
Esta interface fornece um método para gerenciar a terminação.
4. Crie um tópico de inicialização do pool de threads padrão
4.1 Forneça um fio simples que implementa a interface executável
Mythread.java
pacote com.zj.concurrency.executores; classe pública mythread implementa runnable {private int conting = 1, número; public mythread (int num) {number = num; System.out.println ("Criar thread-" + número); } public void run () {while (true) {System.out.println ("Thread-" + número + "run" + count + "tempo (s)"); if (++ count == 3) retornar; }}} Este tópico imprimirá as informações de criação e execução correspondentes.
4.2 Start Thread usando CachedThreadpool
CachedThreadpool.java
pacote com.zj.concurrency.executores; importar java.util.concurrent.executorService; importar java.util.concurrent.executores; classe pública CACHEDTHREADPOOL {public static void main (string [] args) {executorService Exec = executores.newcachedthreadpool (); for (int i = 0; i <5; i ++) exec.execute (novo mythread (i)); exec.shutdown (); }} resultado:
Crie Thread-0Create Thread-1Create Thread-2Crike Thread-3Thread-0 Run 1 Tempo (s) Thread-0 Run 2 Tempo (s) Thread-1 Execute 1 tempo (s) Thread-1 Run 2 Tempo (s) Thread-2 Run 1 tempo (s) Thread-2 Run 2 Trema (s) Criar Thread-4 Thread 1 Run 1 Hora (s) S) Run 2 (s) Thread (s) Crie Thread 1 Thread 1 Thread 1 thread 1 thread 1 s)
4.3 Start Thread usando FILLTHREADPOOL
FILLTHREADPOOL.javapackage com.zj.concurrency.executores; importar java.util.concurrent.executorService; importar java.util.concurrent.executores; classe pública FILLTHREADPOOL {public static void main (string [] args) {executorService Exec = executores.newfixedthreadpool (2); for (int i = 0; i <5; i ++) exec.execute (novo mythread (i)); exec.shutdown (); }} resultado:
Crie Thread-0Create Thread-1Create Thread-2Crike Thread-3Crete Thread-4Thread-0 Run 1 Tempo (s) Thread-0 Run 2 Tempo (s) Thread-2 Execute 1 tempo (s) Thread-2 Run 2 Tempo (s) Thread-3 Run 1 tempo (s) Thread-1 Thread-1 Thread 2 Time (S) Thread-4 Run 1 S (S)-1 Run 2 (s) Thread-1-1 1 Thread-1 1 1 Thread 1 1 1 1 1 tempo 1 (s) Thread 1-1 1 Thread 1-1 1 1 (s) Thread 1-1 1 1 Thread 1 1 1
4.4 Start Thread usando SingleThreadExecutor
SinglethreadExecutor.java
pacote com.zj.concurrency.executores; importar java.util.concurrent.executorService; importar java.util.concurrent.executores; classe pública singlethreadExecutor {public static void main (string [] args) {executorService Exec = executores.newsinglethreadExecutor (); for (int i = 0; i <5; i ++) exec.execute (novo mythread (i)); exec.shutdown (); }} resultado:
Crie Thread-0Create Thread-1Create Thread-2Crike Thread-3Create Thread-4Thread-0 RUN 1 Tempo (s) Thread-0 Run 2 Tempo (s) Thread-1 Execute 1 tempo (s) Thread-1 Run 2 Tempo (s) Thread-2 Run 1 tempo (s) Thread-4 Run 2 tempo (s) Thread-3 Thread 1 tempo S (s) S)-3 Run 2 (s) Thread-4 Thread-4
5. Cooperado com o uso da interface ThreadFactory
Estamos tentando adicionar as configurações de atributos de daemon e prioridade ao thread.
5.1 Definir propriedades do encadeamento de fundo
DaemonThreadFactory.java
pacote com.zj.concurrency.executores.factory; importar java.util.concurrent.ThreadFactory; classe pública DaemonThreadFactory implementos threadfactory {public thread newthread (runnable r) {thread t = new Thread (r); t.SetDaemon (true); retornar t; }}
5.2 Defina atributos prioritários
MaxPriorityThreadFactory.java
pacote com.zj.concurrency.executores.factory; importar java.util.concurrent.ThreadFactory; public class MaxPriorityThreadFactory implementos threadFactory {public Thread Newthread (runnable r) {thread t = new Thread (r); t.setPriority (Thread.max_priority); retornar t; }} Prioridade mínima MinPriorityThreadFactory.java
pacote com.zj.concurrency.executores.factory; importar java.util.concurrent.ThreadFactory; public class MinPriorityThreadFactory implementos threadfactory {public Thread Newthread (runnable r) {thread t = new Thread (r); t.setPriority (Thread.min_Priority); retornar t; }}
5.3 Tópico inicial com configurações de atributo
Execumactory.java
pacote com.zjj.concurrency.executores; importar java.util.concurrent.executorService; importar java.util.concurrent.executores; import com.zj.concurrency.executors.factory.daemoMeRActory; import.zjj.concurrency.exors.Factory.Mactory.MaememReadFractor; com.zj.concurrency.executores.factory.MinPriorityThreadFactory; classe pública ExecFromFactory {public static void main (string [] args) lança Exceção {ExecutorService DefaultExec = Executores.NewCachedThreadpool (); ExecutorService DaemOnexec = Executores .NewCachedThreadpool (new DaemonThreadFactory ()); ExecutorService maxPriorityExec = Executores .NewCachedThreadpool (new MaxPriorityThreadFactory ()); ExecutorService MinPriorityExec = Executores .NewCachedThreadpool (new MinPriorityThreadFactory ()); para (int i = 0; i <10; i ++) daemonexec.execute (novo mythread (i)); for (int i = 10; i <20; i ++) se (i == 10) maxpriorityexec.execute (novo mythread (i)); caso contrário, if (i == 11) minpriorityExec.execute (novo mythread (i)); caso contrário, defaultExec.execute (novo mythread (i)); }} resultado:
Crie Thread-0Create Thread-1Create Thread-2Crike Thread-3Thread-0 Run 1 Tempo (s) Thread-0 Run 2 Tempo (s) Thread-1 Executar 1 tempo (s) Thread-1 Executar 2 tempo (s) Thread-2 Run 1 tempo (s) Thread-2 Run 2 Criar (s) Criar Thread-4 Thread-4 Run 1 tempo (S) tempo-4 Run 2-S) Criar (s) Criar (s) Criar Thread-4Thread-4 Run 1 tempo (S) tempo-4 (s) Run 2 S) Criar (s) Criar (s) Criar 1 Thread-4. Thread-6Create Thread-7Thread-7 Execute 1 tempo (s) Thread-7 Run 2 Tempo (s) Crie Thread-8Thread-8 Execute 1 tempo (s) Thread-8 Run 2 Tempo (s) Crie Thread-9Create Thread-10Thread-10 Run 1 Hora 1 Time (S) Thread-10 Run 2 Time Shread S Thread S Thread (S) RUN (S) Run 1) 1 tempo 1 Tempo (s) Thread-3 Execute 1 tempo (s) Thread-3 Execute 2 Tempo (s) Crie Thread-12Create Thread-13Create Thread-14Thread-12 Execute 1 tempo (s) Thread-12 Run 2 Tempo (s) Thread-13 Run 1 tempo (s) Thread-13 tempo 2 Run 2 (s) Criar Thread-15Thread-15 RUN 1-1-1-1 STRESE (S) Run 2 (S) Run 2 (S) Criar Thread-15TH-1-15 Run 1-1-1-1 S) Run 2 (S) Run 2) Criar Thread-17Create Thread-18Create Thread-19Thread-14 Execute 1 Tempo (s) Thread-14 Execute 2 Tempo (s) Thread-17 Run 1 Tempo (s) Thread-17 Run 2 Tempo (s) Thread-18 Run 1 Tempo (S) Thread-1-18 RUN 2 Tempo (S) Thread-19 1 tempo S) 1-19