fio ThreadLocal de compreensão e aplicação cenários usando gerenciamento de threads ThreadLocal do Android

 

compreensão e gestão de cenários de aplicação Android tópicos ThreadLocal

prefácio:

     estudo recente concluiu animação Android, animação quando aprendeu atributos Android é basicamente olhou para o código-fonte dentro acesso AnimationHandler usando ThreadLocal, despertou minha grande curiosidade e interesse! O acesso às informações relevantes para descobrir que o mais importante Handler Android mecanismo de armazenamento de mensagens Looper também usam ThreadLocal, open source store quadro EventBus envia um status fila de eventos sob o thread atual está usando ThreadLocal, ThreadLocal então por que usá-lo? ThreadLocal O que é isso? Ele pode resolver qualquer tipo de problema? Com tantas perguntas para aprender sob ThreadLocal.

     gerenciamento de threads artigos relacionados Endereço:

ThreadLocal Introdução

   Se você simplesmente ThreadLocal literalmente compreender as palavras como meios "de segmento local", na verdade, não queria dizer isso, mas o nome é enganador jogou muito, e que realmente significa é variáveis ​​de segmentos locais. Para ver como o funcionário disse.

   ThreadLocal definição:  

   Implementar um armazenamento de segmento local, ou seja, cada segmento tem suas próprias variáveis ​​locais. Todos os tópicos compartilhar objetos ThreadLocal,

Mas quando cada thread para acessar estas variáveis ​​para obter valores diferentes, cada thread pode alterar essas variáveis ​​e não afeta outros tópicos, e suporta valores nulos.

ThreadLocal entender

Cada conjuntos de rosca AnimationHeadler olhamos para as propriedades de animação

Copie o código
    private static Animação Handler getOrCreateAnimationHandler () { 
        Animação Handler comercializa = sAnimationHandler.get (); 
        if (agindo == null) { 
            Trades = new Animação Handler (); 
            sAnimationHandler.set (comércios); 
        } 
        Retorno comercializa; 
    }
Copie o código

Porque protegido estática ThreadLocal <AnimationHandler> sAnimationHandler = new ThreadLocal <AnimationHandler> (); não há uso de um valor de inicialização, mas isso não é um objeto por cada novo segmento é criado copiando uma variável e fora do armazenamento. Muitas pessoas pensam que ThreadLocal para resolver o problema de acesso múltiplas threads objetos compartilhados, é errado dizer que, porque se é através da inicialização de variáveis ​​ou criar a sua própria cópia de variáveis ​​locais diretamente através do novo, ThreadLocal.set () para o objeto segmento é o objeto thread para seu próprio uso, acesso a outros tópicos não é necessária, mas também o acesso ao alcance. Cada segmento é acessado em diferentes objetos, a mudança é também o seu próprio objeto em si independente não pertence ao mesmo objeto, conceito não compartilhada, o mais impossível de resolver o objeto compartilhado multithread acesso.

Concluiu o seguinte a partir do entendimento acima

 1. Leia cada segmento tem suas próprias variáveis ​​locais

     Cada segmento tem um independente contexto de outros tópicos para salvar esta variável, variável local para outros segmentos de um segmento não é visível

 2. cópia Inicializar é independente da variável, ou inicializar uma variável de seus próprios

     ThreadLocal pode dar um valor inicial, e cada thread irá receber uma cópia do valor inicial, de forma a garantir um segmento diferente tem uma cópia, você também pode criar uma nova forma para o segmento variável

 3. A única variável é mudado sem perturbar o outro entre a linha de corrente associada com a rosca

    ThreadLocal não resolve o problema para a variável compartilhada, sincronização de threads, a fim de coordenar não existe, mas a fim de facilitar um mecanismo para lidar com seu próprio estado de cada thread introduzido.

Então ThreadLocal não é nem para resolver o problema do acesso ao compartilhada multi-threaded, mas não passe a sincronização, a fim de resolver o problema, ThreadLocal é projetado é para fornecer uma rosca interna variável local, de fácil leitura a qualquer hora, em qualquer lugar neste segmento, e isolado de outros tópicos .

cenários de uso ThreadLocal

      Em que ponto foi o uso de ThreadLocal isso? Muitas vezes vamos criar algum campo estático para salvar o objeto global, em seguida, o objeto pode ser acessado de qualquer segmento, se garantido para ser thread-safe, mas acrescentou que questão nada, mas às vezes difícil assegurar fio de segurança, desta vez, necessidades são criados para a cópia de cada segmento de um objeto, podemos também guardar esses objetos com ConcurrentMap <thread, object>, que seria mais problemas, como quando uma ponta da linha como nós excluir este objeto de discussão copia?

Se você estiver usando ThreadLocal não têm essa preocupação, ThreadLocal garantir que cada thread tem mantido uma referência implícita à sua cópia de um variáveis ​​de segmentos locais, desde que o fio está vivo e a instância ThreadLocal é acessível; após o desaparecimento do segmento, que as instâncias de segmento local todas as cópias serão coleta de lixo (a menos que existam outras referências a estas cópias de). Depois de verificar os dados geralmente obter os dois cenários seguintes:

1.) Quando alguns dos dados em um escopo de rosca, e linhas diferentes têm diferentes cópias dos dados do tempo.

   ocasiões ThreadLocal principalmente para resolver os dados devido a concorrente multi-threading, resultando em inconsistências. espaço ThreadLocal pelo tempo, fornecer uma cópia dos dados no acesso simultâneo de cada thread para executar o negócio, acessando uma cópia deste resultado está consumindo memória, mas grandemente reduzindo a sincronização de threads causada pelo consumo fio é reduzido a complexidade de controlo rosca simultaneidade.

     Como mecanismo de mensagem Handler do Android para Handler, ele precisa obter a linha da laçadeira atual. Obviamente âmbito Looper é o fio, e diferentes segmentos têm Looper diferente, desta vez você pode acessar facilmente em fio de Looper através ThreadLocal.

Como outro exemplo EventBus, EventBus necessidade de obter PostingThreadState objeto para o segmento atual, PostingThreadState diferente o mesmo efeito em um segmento diferente,

EventBus pode facilmente obter objetos PostingThreadState sob o thread atual e operações conexas.

2) a transferência do objecto lógica complexa, tal como ouvinte transferência

   Use a passagem de parâmetro, então: Quando as pilhas de chamadas função mais profundas, o projeto vai ser muito ruim, para cada segmento para definir um ouvinte variável estática, se é multi-threaded, em seguida, uma discussão sobre a necessidade de definir uma variável estática, não pode ser estendida, desta vez usando ThreadLocal você pode resolver o problema.

 Exemplo de Aplicação ThreadLocal

  Como um exemplo simples, que cada segmento tem sua própria fila de tarefa única, semelhante à implementação de EventBus.

Copie o código
  private static final ThreadLocal <PriorityQueue <TaskItem >> queueThreadLocal = new ThreadLocal <PriorityQueue <TaskItem >> () { 
        @Override 
        protegido PriorityQueue <TaskItem> initialValue () { 
            return new PriorityQueue <> (5); 
        } 
    }; 


    pública PriorityQueue <TaskItem> getTaskQueue () { 
        PriorityQueue <TaskItem> TaskItems = queueThreadLocal.get (); 
        retorno TaskItems; 
    } 


    Public void addTask (TaskItem TaskItem) { 
        PriorityQueue <TaskItem> TaskItems = queueThreadLocal.get (); 
        taskItems.add (TaskItem); 
    }

    Public void removeTask (TaskItem TaskItem) {
        PriorityQueue <TaskItem> TaskItems = queueThreadLocal.get (); 
        se (taskItems.contains (TaskItem)) { 
            taskItems.remove (TaskItem); 
        } 
    } 

    Private void exceTask () { 
        PriorityQueue <TaskItem> TaskItems = queueThreadLocal.get (); 
        if (taskItems.isEmpty ()!) { 
            TaskItem TaskItem = taskItems.poll (); 
            taskItem.exceTask (); 
        } 
    }
Copie o código

 Anexar o código TaskItme:

Copie o código
classe pública TaskItem implementos Comparável { 
    private Long id; 
    private String nome; 
    prioridade int privado; 

    longa getId pública () { 
        retornar Id; 
    } 

    SetId public void (long id) { 
        Id = id; 
    } 

    GetName public String () { 
        nome de retorno; 
    } 

    SetName public void (String nome) { 
        this.name = nome; 
    } 

    GetPriority int público () { 
        prioridade de retorno; 
    } 

    SetPriority public void (prioridade int) { 
        this.priority = prioridade; 
    } 

    @Override 
    Public int compareTo (arg0 Object) { 
        if (TaskItem.class.isInstance (arg0)) { 
            TaskItem tm = (TaskItem) arg0; 
            se (tm.priority> prioridade) { 
                retorno -1; 
            } Else if (tm.priority <priority) { 
                return 1; 
            } 
        } 
        Return 0; 
    } 

    Public void exceTask () { 
        Log.e ( "exceTask", "exceTask --- id:" + ID + "nome:" + nome); 
    } 

}

Depois que o código acima pode ser visto, a tarefa em que enfiar-lhe são submetidos automaticamente adicionados à fila de tarefas no segmento dentro pertence, aqui, de facto, por ConcurrentMap <Thread, Object> Salvar também é possível, ela disse acima relativamente problemas.

resumo:

   Se você quer aprender por exemplo, em seguida, um olhar pessoal EventBus recomendado para uso exemplo ThreadLocal, com um muito inteligente e muito fácil de entender, apenas menos usamos no desenvolvimento de projetos diária ThreadLocal si, uma metade será difícil encontrar uma cena apropriada para conhecê-lo.

 

prefácio:

     estudo recente concluiu animação Android, animação quando aprendeu atributos Android é basicamente olhou para o código-fonte dentro acesso AnimationHandler usando ThreadLocal, despertou minha grande curiosidade e interesse! O acesso às informações relevantes para descobrir que o mais importante Handler Android mecanismo de armazenamento de mensagens Looper também usam ThreadLocal, open source store quadro EventBus envia um status fila de eventos sob o thread atual está usando ThreadLocal, ThreadLocal então por que usá-lo? ThreadLocal O que é isso? Ele pode resolver qualquer tipo de problema? Com tantas perguntas para aprender sob ThreadLocal.

     gerenciamento de threads artigos relacionados Endereço:

ThreadLocal Introdução

   Se você simplesmente ThreadLocal literalmente compreender as palavras como meios "de segmento local", na verdade, não queria dizer isso, mas o nome é enganador jogou muito, e que realmente significa é variáveis ​​de segmentos locais. Para ver como o funcionário disse.

   ThreadLocal definição:  

   Implementar um armazenamento de segmento local, ou seja, cada segmento tem suas próprias variáveis ​​locais. Todos os tópicos compartilhar objetos ThreadLocal,

Mas quando cada thread para acessar estas variáveis ​​para obter valores diferentes, cada thread pode alterar essas variáveis ​​e não afeta outros tópicos, e suporta valores nulos.

ThreadLocal entender

Cada conjuntos de rosca AnimationHeadler olhamos para as propriedades de animação

Copie o código
    private static Animação Handler getOrCreateAnimationHandler () { 
        Animação Handler comercializa = sAnimationHandler.get (); 
        if (agindo == null) { 
            Trades = new Animação Handler (); 
            sAnimationHandler.set (comércios); 
        } 
        Retorno comercializa; 
    }
Copie o código

Porque protegido estática ThreadLocal <AnimationHandler> sAnimationHandler = new ThreadLocal <AnimationHandler> (); não há uso de um valor de inicialização, mas isso não é um objeto por cada novo segmento é criado copiando uma variável e fora do armazenamento. Muitas pessoas pensam que ThreadLocal para resolver o problema de acesso múltiplas threads objetos compartilhados, é errado dizer que, porque se é através da inicialização de variáveis ​​ou criar a sua própria cópia de variáveis ​​locais diretamente através do novo, ThreadLocal.set () para o objeto segmento é o objeto thread para seu próprio uso, acesso a outros tópicos não é necessária, mas também o acesso ao alcance. Cada segmento é acessado em diferentes objetos, a mudança é também o seu próprio objeto em si independente não pertence ao mesmo objeto, conceito não compartilhada, o mais impossível de resolver o objeto compartilhado multithread acesso.

Concluiu o seguinte a partir do entendimento acima

 1. Leia cada segmento tem suas próprias variáveis ​​locais

     Cada segmento tem um independente contexto de outros tópicos para salvar esta variável, variável local para outros segmentos de um segmento não é visível

 2. cópia Inicializar é independente da variável, ou inicializar uma variável de seus próprios

     ThreadLocal pode dar um valor inicial, e cada thread irá receber uma cópia do valor inicial, de forma a garantir um segmento diferente tem uma cópia, você também pode criar uma nova forma para o segmento variável

 3. A única variável é mudado sem perturbar o outro entre a linha de corrente associada com a rosca

    ThreadLocal não resolve o problema para a variável compartilhada, sincronização de threads, a fim de coordenar não existe, mas a fim de facilitar um mecanismo para lidar com seu próprio estado de cada thread introduzido.

Então ThreadLocal não é nem para resolver o problema do acesso ao compartilhada multi-threaded, mas não passe a sincronização, a fim de resolver o problema, ThreadLocal é projetado é para fornecer uma rosca interna variável local, de fácil leitura a qualquer hora, em qualquer lugar neste segmento, e isolado de outros tópicos .

cenários de uso ThreadLocal

      Em que ponto foi o uso de ThreadLocal isso? Muitas vezes vamos criar algum campo estático para salvar o objeto global, em seguida, o objeto pode ser acessado de qualquer segmento, se garantido para ser thread-safe, mas acrescentou que questão nada, mas às vezes difícil assegurar fio de segurança, desta vez, necessidades são criados para a cópia de cada segmento de um objeto, podemos também guardar esses objetos com ConcurrentMap <thread, object>, que seria mais problemas, como quando uma ponta da linha como nós excluir este objeto de discussão copia?

Se você estiver usando ThreadLocal não têm essa preocupação, ThreadLocal garantir que cada thread tem mantido uma referência implícita à sua cópia de um variáveis ​​de segmentos locais, desde que o fio está vivo e a instância ThreadLocal é acessível; após o desaparecimento do segmento, que as instâncias de segmento local todas as cópias serão coleta de lixo (a menos que existam outras referências a estas cópias de). Depois de verificar os dados geralmente obter os dois cenários seguintes:

1.) Quando alguns dos dados em um escopo de rosca, e linhas diferentes têm diferentes cópias dos dados do tempo.

   ocasiões ThreadLocal principalmente para resolver os dados devido a concorrente multi-threading, resultando em inconsistências. espaço ThreadLocal pelo tempo, fornecer uma cópia dos dados no acesso simultâneo de cada thread para executar o negócio, acessando uma cópia deste resultado está consumindo memória, mas grandemente reduzindo a sincronização de threads causada pelo consumo fio é reduzido a complexidade de controlo rosca simultaneidade.

     Como mecanismo de mensagem Handler do Android para Handler, ele precisa obter a linha da laçadeira atual. Obviamente âmbito Looper é o fio, e diferentes segmentos têm Looper diferente, desta vez você pode acessar facilmente em fio de Looper através ThreadLocal.

Como outro exemplo EventBus, EventBus necessidade de obter PostingThreadState objeto para o segmento atual, PostingThreadState diferente o mesmo efeito em um segmento diferente,

EventBus pode facilmente obter objetos PostingThreadState sob o thread atual e operações conexas.

2) a transferência do objecto lógica complexa, tal como ouvinte transferência

   Use a passagem de parâmetro, então: Quando as pilhas de chamadas função mais profundas, o projeto vai ser muito ruim, para cada segmento para definir um ouvinte variável estática, se é multi-threaded, em seguida, uma discussão sobre a necessidade de definir uma variável estática, não pode ser estendida, desta vez usando ThreadLocal você pode resolver o problema.

 Exemplo de Aplicação ThreadLocal

  Como um exemplo simples, que cada segmento tem sua própria fila de tarefa única, semelhante à implementação de EventBus.

Copie o código
  private static final ThreadLocal <PriorityQueue <TaskItem >> queueThreadLocal = new ThreadLocal <PriorityQueue <TaskItem >> () { 
        @Override 
        protegido PriorityQueue <TaskItem> initialValue () { 
            return new PriorityQueue <> (5); 
        } 
    }; 


    pública PriorityQueue <TaskItem> getTaskQueue () { 
        PriorityQueue <TaskItem> TaskItems = queueThreadLocal.get (); 
        retorno TaskItems; 
    } 


    Public void addTask (TaskItem TaskItem) { 
        PriorityQueue <TaskItem> TaskItems = queueThreadLocal.get (); 
        taskItems.add (TaskItem); 
    } 

    Public void removeTask (TaskItem TaskItem) {
        PriorityQueue <TaskItem> TaskItems = queueThreadLocal.get ();  
        PriorityQueue <TaskItem> TaskItems = queueThreadLocal.get ();
        se (taskItems.contains (TaskItem)) { 
            taskItems.remove (TaskItem); 
        } 
    } 

    Private void exceTask () { 
        PriorityQueue <TaskItem> TaskItems = queueThreadLocal.get (); 
        if (taskItems.isEmpty ()!) { 
            TaskItem TaskItem = taskItems.poll (); 
            taskItem.exceTask (); 
        } 
    }
Copie o código

 Anexar o código TaskItme:

Copie o código
classe pública TaskItem implementos Comparável { 
    private Long id; 
    private String nome; 
    prioridade int privado; 

    longa getId pública () { 
        retornar Id; 
    } 

    SetId public void (long id) { 
        Id = id; 
    } 

    GetName public String () { 
        nome de retorno; 
    } 

    SetName public void (String nome) { 
        this.name = nome; 
    } 

    GetPriority int público () { 
        prioridade de retorno; 
    } 

    SetPriority public void (prioridade int) { 
        this.priority = prioridade; 
    } 

    @Override 
    Public int compareTo (arg0 Object) {
        se (TaskItem.class.isInstance arg0) () { 
            TaskItem TM = (TaskItem) arg0; 
            se (tm.priority> prioridade) { 
                retorno -1; 
            } Else if (tm.priority <priority) { 
                return 1; 
            } 
        } 
        Return 0; 
    } 

    Public void exceTask () { 
        Log.e ( "exceTask", "exceTask --- id:" + ID + "nome:" + nome); 
    } 

}

Depois que o código acima pode ser visto, a tarefa em que enfiar-lhe são submetidos automaticamente adicionados à fila de tarefas no segmento dentro pertence, aqui, de facto, por ConcurrentMap <Thread, Object> Salvar também é possível, ela disse acima relativamente problemas.

resumo:

   Se você quer aprender por exemplo, em seguida, um olhar pessoal EventBus recomendado para uso exemplo ThreadLocal, com um muito inteligente e muito fácil de entender, apenas menos usamos no desenvolvimento de projetos diária ThreadLocal si, uma metade será difícil encontrar uma cena apropriada para conhecê-lo.

 

Acho que você gosta

Origin www.cnblogs.com/awkflf11/p/12616860.html
Recomendado
Clasificación