Multithread pour s'adapter au modèle [Java]

introduction

Utilisez le multithreading pour un traitement prenant du temps similaire, tel que le traitement par lots, Il y a des moments où vous voulez gagner du temps.

Par exemple, pour simplifier et réfléchir Envisagez de traiter 10 choses qui prennent 5 minutes par processus. Un fil prend 5 * 10 = 50 minutes, Je sens que 10 fils se termineront en 5 minutes.

Dans un tel cas, l'écriture avec un traitement thread-safe est C'est assez pénible. À partir de la prochaine fois, afin de réduire le fardeau psychologique dans des situations similaires Je l'ai écrit parce que je voulais créer quelque chose comme un moule.

Exemple d'implémentation

Pour le moment, il s'agit d'un cadre approximatif qui vous permet d'écrire en toute sécurité. Je vais tout omettre sauf les informations que je veux, alors Lorsque vous intégrez votre propre traitement nécessaire, J'imagine un "moule" qui semble terminé.

MultiThreadExecute.java


/**
*Classe multi-thread
*Créez un fil ici et exécutez-le
*/
public class MultiThreadExecute {
	public static void main(String[] args) {
		MultiThreadExecute logic = new MultiThreadExecute();
		int status = logic.run();
	}

	/**Nombre de threads créés*/
	private static const THREAD_COUNT = 5;
	
	protected int run() {
	
		//Acquisition des données à traiter
		int dataSize = ...(réduction)...;
		
		//Traitement d'exécution parallèle
		//Augmentez la zone du nombre de threads pour inclure le traitement de fin
		final BlockingQueue<DataDto> taskQueue =
            new LinkedBlockingQueue<DataDto>(dataSize + THREAD_COUNT);
            
		//Ajouter à la liste
		for (DataDto data : (réduction. Viens de quelque part)) {
			taskQueue.add(data);
		}
		
		final OnExecListener listener = new OnExecListener();
		final ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
        for (int i = 0; i < THREAD_COUNT; i++) {
            //Assurez-vous de connaître la fin
            taskQueue.add(Mettez un DataDto vide, etc.);

            //Exécution des threads enfants
            final LogicTask task = new LogicTask(taskQueue, listener);
            executor.execute(task);
        }

		//Attendre la fin du fil
        executor.shutdown();
        while (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
        }
		
		//Obtenez le nombre de traitements, etc. comme suit
		// listener.getTotalCount()
	}
}

DataDto.java


public class DataDto {
	//Stocke les arguments à transmettre pour le traitement
}

Listener.java


/**
 *Détection de fin de traitement
 */
private static interface Listener {
	/**
	*Concevez et créez les informations souhaitées après le traitement
	*En définissant exactement l'interface,
	*Soyez flexible pour répondre aux informations que vous souhaitez
	*/
	void execute();
}

OnExecListener.java


/**
 *Fin du traitement de l'auditeur
 */
private static class OnExecListener implements Listener {

	private int totalCount = 0;

    @Override
    public void execute(){
        synchronized (this) {
            totalCount++;
        }
    }

    synchronized int getTotalCount() {
        return totalCount;
    }
}

LogicTask.java


private static class LogicTask implements Runnable {
	private final BlockingQueue<DataDto> taskQueue;
	private final Listener listener;
	
	/**
	*constructeur
	*/
	LogicTask(BlockingQueue<DataDto> taskQueue, Listener listener) {
		this.taskQueue = taskQueue;
		this.listener = listener;
	}

	/**
	*Exécuter une tâche
	*/
	@Override
	public void run() {
		try {
		    while (true) {
		        if (Fin du jugement) {
		            break;
		        }
		        
		        final DataDto data = taskQueue.take();
		        
		        //Effectuer un traitement chronophage
		        exec(data);
		    }
		} catch (//réduction) {
		    //réduction
		}
	}
	
	private void exec(DataDto data){
		//réduction
		return;
	}
}

Ce que je pensais

Recommended Posts

Multithread pour s'adapter au modèle [Java]
Comment apprendre JAVA en 7 jours
Enregistrer la sortie dans un fichier en Java
Comment utiliser les classes en Java?
Comment nommer des variables en Java
Essayez d'implémenter Yuma en Java
Comment concaténer des chaînes avec Java
Comment implémenter le calcul de la date en Java
Comment implémenter le filtre de Kalman par Java
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
Essayez de résoudre Project Euler en Java
Facile à créer Slack Bot avec Java
Essayez d'implémenter l'ajout n-aire en Java
Comment faire une conversion de base en Java
Remplacez List <Optional <T >> par Optional <List <T >> en Java
Convertir des fichiers SVG en fichiers PNG en Java
Comment appliquer les conventions de codage en Java
Comment intégrer Janus Graph dans Java
Comment obtenir la date avec Java
Ajouter des notes de bas de page aux documents Word en Java
[Java Bronze] 5 problèmes à garder à l'esprit
Exemple pour décompresser le fichier gz en Java
De Java à C et de C à Java dans Android Studio
Ajouter l'attribut SameSite au cookie en Java
Partition en Java
Changements dans Java 11
Janken à Java
Modèle [Java] .gitignore
[Java] Introduction à Java
Introduction à Java
Taux circonférentiel à Java
FizzBuzz en Java
Deux façons de démarrer un thread en Java + @
Je souhaite envoyer un e-mail en Java.
Comment afficher une page Web en Java
CORBA semble avoir été supprimé dans Java SE 11. .. ..
Code pour échapper aux chaînes JSON en Java
Essayez de créer un babillard en Java
Comment obtenir une classe depuis Element en Java
Il ne semble pas y avoir d'autre-si en java
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
rsync4j --Je veux toucher rsync en Java.
Comment masquer les champs nuls en réponse en Java
Bibliothèque "OSHI" pour acquérir des informations système avec Java
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
Comment résoudre les problèmes d'expression en Java
J'ai essayé de créer une compétence Alexa avec Java
Comment écrire Java String # getBytes dans Kotlin?
Points à connaître avec Java Equals
Lire JSON en Java
Implémentation de l'interpréteur par Java
Faites un blackjack avec Java
Comment appeler des fonctions en bloc avec la réflexion Java
Comment créer un environnement Java en seulement 3 secondes
Application Janken en Java
[Java] Comment omettre le constructeur privé dans Lombok
Programmation par contraintes en Java
Exemple de code pour convertir List en List <String> dans Java Stream