Comparaison des méthodes d'implémentation de thread en Java et de la méthode d'expression lambda

introduction

Pressé, depuis le lieu de travail pour faire un programme multi-thread avec Java Je vais résumer ce que j'ai appris à la hâte pour répondre à des demandes déraisonnables.

Conclusion: si vous souhaitez démarrer rapidement pour le moment

Si le chemin d'accès au démarrage du sous-thread est petit et que vous ne souhaitez pas conserver le sous-thread en tant qu'instance, combinez des expressions lambda

ThreadStartTemplate.java


new Thread( () -> {Méthode ou processus que vous souhaitez exécuter dans un sous-thread} ).start()

Cela semble bon. C'est pratique.

Environnement d'exécution

J'ai reporté l'installation d'Eclipse par moi-même, et pour le moment, j'ai utilisé paiza.io pour vérifier la grammaire.

Comment implémenter des sous-threads

Il semble que les threads peuvent être implémentés avec les deux modèles suivants.

  1. Utilisez l'interface Rnnable.
  2. Héritez de la classe Thread.

1. Utilisez l'interface Runnable

Il semble que Java possède une interface Runnable, et en surchargeant run (), il semble que le traitement exécuté au moment du thread puisse être implémenté. L'utilisation est la suivante.

  1. Créez une instance d'une classe qui implémente l'interface Runnable
  2. Passez un objet Runnnable au constructeur pour créer un objet de type Thread
  3. Appelez la méthode start () de la classe Thread pour démarrer un sous-thread

L'exemple de code écrit selon cette rue est RunnableSample.java.

RunnableSample.java


import java.util.*;

public class Main {
    
    private static class RunnableSample implements Runnable{
        
        private String thread_no;
        RunnableSample(String str){
            this.thread_no = str;
        }
        public void run(){
            System.out.println("RunnableThread Starting No."+thread_no);
        }
    }
    
    public static void main(String[] args) throws Exception {
        String str1 = "1";
        String str2 = "2";
        RunnableSample runner1 = new RunnableSample(str1); // 1.
        RunnableSample runner2 = new RunnableSample(str2); // 1.
        Thread thread1 = new Thread(runner1); // 2.
        Thread thread2 = new Thread(runner2); // 2.
        thread1.start(); // 3.
        thread2.start(); // 3.
        
        Thread.sleep(200);
        System.out.println("MainThread End");
    }
}

Résultat d'exécution


RunnableThread Starting No.1
RunnableThread Starting No.2
MainThread End

La classe RunnableSample est définie comme une classe locale de la classe Main. Créez un objet de la classe RunnableSample à partir du thread principal et exécutez-le en tant que deux sous-threads.

RunnableThread Starting No.1 RunnableThread Starting No.2 Peut être émis dans l'ordre inverse. L'extrémité du fil principal sera généralement sortie en dernier car elle a une veille de 200 ms entre les deux.

2. Héritez de la classe Thread.

Ensuite, j'écrirai sur la façon d'hériter de la classe Thread et d'implémenter le traitement des sous-threads. L'utilisation est la suivante. Le code est ThreadSample.java.

  1. Créez une instance de la classe qui remplace run () de la classe Thread
  2. Appelez la méthode start () de la classe Thread pour démarrer un sous-thread

ThreadSample.java


import java.util.*;

public class Main {
    
    private static class ThreadSample extends Thread{
        
        private String thread_no;
        ThreadSample(String str){
            this.thread_no = str;
        }
        public void run(){
            System.out.println("RunnableThread Starting No."+thread_no);
        }
    }
    
    public static void main(String[] args) throws Exception {

        String str1 = "1";
        String str2 = "2";
        ThreadSample thread1 = new ThreadSample(str1); // 1.
        ThreadSample thread2 = new ThreadSample(str2); // 1.
        thread1.start(); // 2.
        thread2.start(); // 2.
        
        Thread.sleep(200);
        System.out.println("MainThread End");
    }
}

Résultat d'exécution


RunnableThread Starting No.2
RunnableThread Starting No.1
MainThread End

Le résultat de l'exécution sera le même (cette fois, l'ordre de sortie de Thread1 et Thread2 a été inversé).

Après tout, quel est le meilleur, "implémentation de l'interface Runnable" ou "héritage de la classe Thread"?

En gros, l'utilisation de l'interface Runnable présente de nombreux avantages.

--Java n'autorise pas l'héritage multiple, donc si vous héritez de la classe Thread, les autres classes ne pourront pas en hériter. Toute classe qui implémente l'interface Runnable peut hériter d'autres classes.

Ce serait parfait si je pouvais écrire proprement même avec l'interface Runnable. Je vais essayer.

Simplifiez la description de l'interface Runnable avec des expressions lambda.

Essayez de simplifier le code avec des expressions lambda en vous reportant à Présentation des expressions lambda Java 8.

LambdaThreadSample.java


import java.util.*;

public class Main {
    
    static private void subthread_run(String thread_no){
        System.out.println("RunnableThread Starting No."+thread_no);
    }
    
    public static void main(String[] args) throws Exception {

        String str1 = "1";
        String str2 = "2";
        new Thread( () -> {subthread_run(str1);} ).start();
        new Thread( () -> {subthread_run(str2);} ).start();
        
        Thread.sleep(200);
        System.out.println("MainThread End");
    }
}

Résultat d'exécution


RunnableThread Starting No.2
RunnableThread Starting No.1
MainThread End

Pour la méthode de description détaillée, reportez-vous à Understanding Java 8 Lambda Expressions, mais ~~ difficile à expliquer ~~ La classe RunnableSample est une classe anonyme avec une méthode subthread_run, et l'objet de classe Thread est nouveau et démarré. En utilisant la formule lambda, le programme est devenu beaucoup plus propre et plus lisible. C'est un bon moyen d'écrire si vous n'avez pas besoin de gérer Thread en tant qu'instance. Ensuite, je voudrais résumer Synchronisé.

Les références

150 questions pour former des compétences en programmation pour combattre dans le monde Chapitre 16: Threads et verrous

Recommended Posts

Comparaison des méthodes d'implémentation de thread en Java et de la méthode d'expression lambda
Méthodes Java et surcharges de méthodes
Implémentation Java de tri-tree
Implémentez Thread en Java et essayez d'utiliser la classe anonyme Lambda
[Java] Méthode de comparaison de chaînes de caractères et méthode de comparaison utilisant des expressions régulières
Exemple de description et d'implémentation de BloomFilter (JAVA)
Implémentation d'une fonction similaire en Java
Mécanisme et caractéristiques de la classe d'implémentation Collection souvent utilisés en Java
Implémentation de la méthode de clonage pour Java Record
Implémentation de DBlayer en Java (RDB, MySQL)
[Java / Swift] Comparaison de l'interface Java et du protocole Swift
[Java] Comparaison des méthodes d'opération de la collection et de StringBuilder
Discrimination d'énum dans Java 7 et supérieur
Ceci et cela de la mise en œuvre du jugement en temps réel des dates en Java
[Java] Gestion des Java Beans dans la chaîne de méthodes
[Java] Résumé personnel des classes et méthodes (basique)
Vérifier le comportement statique et public dans les méthodes Java
[Java] Est-il inutile de vérifier "l'identité" dans l'implémentation de la méthode equals ()?
Java 8 pour démarrer maintenant ~ for Each et expression lambda ~
[Java] Expression Lambda
Comparaison Java et Swift (3) Implémentation de classe / héritage de classe / conception de classe
Nom de méthode de la chaîne de méthodes dans Java Builder + α
Expression lambda Java
[Java] Mémo de méthode d'implémentation pour définir le jeton de nom d'utilisateur WS-Security dans SOAP Stub of axis2
La comparaison d'énumération est ==, et equals est bonne [Java]
Utilisation correcte de la classe abstraite et de l'interface en Java
Comparaison équivalente de la classe wrapper Java et du type primitif
Repenser les modèles d'expression et de conception de flux Java8 - Modèle de méthode
Implémentation de l'interpréteur par Java
[Java] Thread et exécutable
expression 1 de la table lambda neutre java
[Java] Comparaison des chaînes de caractères et && et ||
Implémentation Boyer-Moore en Java
Fonctionnalité d'expression lambda Java 8
mémo d'expression java lambda
expression lambda java [écriture de notes]
Etudier Java 8 (expression lambda)
Évaluer java8 ~ Type Lambda ~
Expression lambda Java à nouveau
Méthode de paramétrage pour lier Java d'Eclipse et Github / septembre 2017
[Pour les débutants] Explication des classes, des instances et des statiques en Java
Même jugement / jugement de valeur égale / comparaison / ordre dans Swift et Java
Définir des méthodes abstraites dans l'énumération Java et écrire leur comportement
Pensez aux différences entre les fonctions et les méthodes (en Java)
Java8 Lambda Expression & Stream Design Pattern Repenser - Modèle de chaîne de responsabilité -
[Java] Nouvelle méthode de génération de threads (2)
[Java] Interface fonctionnelle / expression lambda
[Java] Classe générique et méthode générique
[Java] Implémentation du réseau Faistel
Flux Java8, résumé de l'expression lambda
[Java] Méthode d'implémentation du traitement du minuteur
Avantages et inconvénients de Java
Avantages de la méthode statique Java
Méthodes et classes abstraites Java
Implémentation de HashMap avec kotlin
[Java] Nouvelle méthode de génération de threads (1)
Comparaison du développement d'applications WEB avec Rails et Java Servlet + JSP
Créons une application TODO en Java 4 Implémentation de la fonction de publication