[Java] Thread et exécutable

Étape 1, programme supposant la vente de billets

1.1 Créer Mythread

1.2 Démarrer à partir de la fonction principale

Ci-dessous un exemple

class Mythread extends Thread {

	private int ticket = 5;
	@Override
	public void run() {
		for(int i =0 ; i<10 ; i++) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {

// Bloc catch généré automatiquement par TODO e.printStackTrace(); } if(ticket > 0 ) { ticket--; L.d ("Le nombre de billets restants est" + ticket + ""); } } } }

public class ThreadSample {

	public static void main(String[] args) {
		Mythread mythread = new Mythread();

L.d ("Début de la vente des billets"); mythread.start(); } }

résultat: ThreadSample # main: 34 nom du thread: id du thread principal: 1 gentest :: Ticket sales start Mythread # run: 24 nom du thread: Thread-0 id du thread: 11 gentest :: 4 tickets restants Mythread # run: 24 nom du thread: Thread-0 id du thread: 11 gentest :: 3 tickets restants Mythread # run: 24 nom du thread: Thread-0 id du thread: 11 gentest :: 2 tickets restants Mythread # run: 24 nom du thread: Thread-0 id du thread: 11 gentest :: 1 ticket restant Mythread # run: 24 nom du fil: Thread-0 id du fil: 11 gentest :: 0 billets restants

Étape 2, ajouter un rapport (rappel) une fois la vente des billets terminée

2.1 Créer une interface

2.2 Réalisation d'interface en classe principale

2.3 Ajout du constructeur Mythread

2.4 Ajouter un rappel à l'exécution de Mythread

Ci-dessous un exemple

interface MyTaskResult {
	void ticketSoldout();
	void ticketRemain();
}

class Mythread extends Thread {
	private MyTaskResult myTaskResult;
	public Mythread (MyTaskResult myTaskResult) {
		this.myTaskResult = myTaskResult;
	}

	private int ticket = 5;
	@Override
	public void run() {
		for(int i =0 ; i<10 ; i++) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {

// Bloc catch généré automatiquement par TODO e.printStackTrace(); } if(ticket > 0 ) { ticket--; L.d ("Le nombre de billets restants est" + ticket + ""); } } if(ticket>0) { myTaskResult.ticketRemain(); }else { myTaskResult.ticketSoldout(); } } }

public class ThreadSample {

	public static void main(String[] args) {
		Mythread mythread = new Mythread(myTaskResult);

L.d ("Début de la vente des billets"); mythread.start(); } static MyTaskResult myTaskResult = new MyTaskResult() {

		@Override
		public void ticketSoldout() {

L.d ("Merci pour votre travail acharné."); }

		@Override
		public void ticketRemain() {

L.d ("N'est-ce pas fini?"); } }; }

Le résultat est

ThreadSample # main: 43 nom du thread: id du thread principal: 1 gentest :: Ticket sales start Mythread # run: 28 nom du thread: Thread-0 id du thread: 11 gentest :: 4 tickets restants Mythread # run: 28 nom du fil: Thread-0 id du fil: 11 gentest :: 3 tickets restants Mythread # run: 28 nom du fil: Thread-0 id du fil: 11 gentest :: 2 tickets restants Mythread # run: 28 nom du fil: Thread-0 id du fil: 11 gentest :: 1 ticket restant Mythread # run: 28 nom du fil: Thread-0 id du fil: 11 gentest :: 0 billets restants ThreadSample $ 1 # ticketSoldout: 50 nom du fil: Thread-0 id du fil: 11 gentest :: Merci.

Étape 3, vendre des billets dans plusieurs distributeurs automatiques de billets

3.1 Ajout de Runnable (TicketBox)

3.2 Ajout du nombre de fils, ajout du nom du fil (substitut 1, 2, 3)

Ci-dessous un exemple

interface MyTaskResult {
	void ticketSoldout(String threadName);
	void ticketRemain(String threadName);
}

class TicketBox implements Runnable {
	private int ticket = 5;
	@Override
	public void run() {
		for(int i =0 ; i<10 ; i++) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {

// Bloc catch généré automatiquement par TODO e.printStackTrace(); } if(ticket > 0 ) { ticket--; L.d ("Le nombre de billets restants est" + ticket + ""); } } L.d ("Ticket complété:" + ticket); } }

class Mythread extends Thread {
	private MyTaskResult myTaskResult;
	public Mythread (Runnable r, MyTaskResult myTaskResult,String threadName) {
		super(r);
		this.myTaskResult = myTaskResult;
		setName(threadName);
	}

	private int ticket = 5;
	@Override
	public void run() {
		super.run();
	}
}

public class ThreadSample {

	public static void main(String[] args) {
		TicketBox ticketBox = new TicketBox();

Mythread mythread1 = nouveau Mythread (ticketBox, myTaskResult, "proxy 1"); Mythread mythread2 = nouveau Mythread (ticketBox, myTaskResult, "proxy 2"); Mythread mythread3 = nouveau Mythread (ticketBox, myTaskResult, "proxy 3"); L.d ("Début de la vente des billets"); mythread1.start(); mythread2.start(); mythread3.start(); } static MyTaskResult myTaskResult = new MyTaskResult() {

		@Override
		public void ticketSoldout(String threadName) {

L.d ("Merci pour votre travail acharné." + ThreadName); }

		@Override
		public void ticketRemain(String threadName) {

L.d ("N'est-ce pas fini?" + ThreadName); } }; }

résultat

ThreadSample # main: 52 nom du thread: id du thread principal: 1 gentest :: Ticket sales start TicketBox # run: 23 nom du thread: proxy 2 id du thread: 12 gentest :: 3 tickets restants TicketBox # run: 23 nom du fil: proxy 1 id du fil: 11 gentest :: 3 tickets restants TicketBox # run: 23 nom du thread: proxy 3 id du thread: 13 gentest :: 3 tickets restants TicketBox # run: 23 nom du thread: proxy 1 id du thread: 11 gentest :: 2 tickets restants TicketBox # run: 23 nom du thread: proxy 2 id du thread: 12 gentest :: 1 ticket restant TicketBox # run: 23 nom du thread: proxy 3 id du thread: 13 gentest :: 0 tickets restants TicketBox # run: 26 nom du thread: Proxy 2 id du thread: 12 gentest :: Tickets restants terminés: 0 TicketBox # run: 26 nom du thread: Proxy 3 id du thread: 13 gentest :: Tickets restants terminés: 0 TicketBox # run: 26 nom du thread: Proxy 1 id du thread: 11 gentest :: Tickets restants terminés: 0

problème:

  1. J'ai vendu 6 fois pour 5 billets. (Synchronisation requise)
  2. Chaque agence ne fait pas état du nombre d'exemplaires publiés

Étape 4 Traitement synchrone

class TicketBox implements Runnable {
	private int ticket = 5;
	@Override
	public void run() {
		for(int i =0 ; i<10 ; i++) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {

// Bloc catch généré automatiquement par TODO e.printStackTrace(); } saleTicket(); } L.d ("Ticket restant terminé:" + ticket); } private synchronized void saleTicket() { if(ticket > 0 ) { ticket--; L.d ("Le nombre de billets restants est" + ticket + ""); } } }

résultat

ThreadSample # main: 55 nom du thread: id du thread principal: 1 gentest :: Ticket sales start TicketBox # saleTicket: 28 nom de fil: Proxy 2 ID de fil: 12 gentest :: 4 billets restants TicketBox # saleTicket: 28 nom de fil: Proxy 3 ID de fil: 13 gentest :: 3 billets restants TicketBox # saleTicket: 28 nom de fil: Proxy 1 ID de fil: 11 gentest :: 2 billets restants TicketBox # saleTicket: 28 nom de fil: Proxy 2 ID de fil: 12 gentest :: 1 ticket restant TicketBox # saleTicket: 28 nom de fil: Proxy 1 ID de fil: 11 gentest :: 0 billets restants TicketBox # run: 23 nom du fil: Proxy 2 id du fil: 12 gentest :: Tickets restants terminés: 0 TicketBox # run: 23 nom du fil: Proxy 3 id du fil: 13 gentest :: Tickets restants terminés: 0 TicketBox # run: 23 nom du fil: Proxy 1 id du fil: 11 gentest :: Tickets restants terminés: 0

Étape 5 Résumé des résultats des ventes

Veuillez vous référer à github

résultat

ThreadSample # main: 85 nom du thread: id du thread principal: 1 gentest :: Ticket sales start TicketBox # saleTicket: 52 nom de fil: Proxy 2 ID de fil: 12 gentest :: 4 billets restants TicketBox # saleTicket: 52 nom de fil: Proxy 1 ID de fil: 11 gentest :: 3 billets restants TicketBox # saleTicket: 52 nom de fil: Proxy 3 ID de fil: 13 gentest :: 2 billets restants TicketBox # saleTicket: 52 nom de fil: Proxy 1 ID de fil: 11 gentest :: 1 ticket restant TicketBox # saleTicket: 52 nom de fil: Proxy 2 ID de fil: 12 gentest :: 0 billets restants ThreadSample $ 1 # taskDone: 95 nom de thread: Proxy 1 id de thread: 11 gentest :: Merci. Adjoint 1 ThreadSample $ 1 # taskDone: 95 nom de thread: Proxy 2 ID de thread: 12 gentest :: Merci. Substitut 2 ThreadSample $ 1 # taskDone: 95 nom de thread: Proxy 3 ID de thread: 13 gentest :: Merci pour votre travail. Adjoint 3 ThreadSample $ 1 # taskDone: 100 nom de thread: Proxy 3 id de thread: 13 gentest :: ---------------- Tous les rapports terminés ------------- --------------- ThreadSample $ 2 # sendResult: 108 nom de thread: Proxy 3 ID de thread: 13 gentest :: Nombre total de tickets: 5 ThreadSample $ 2 # sendResult: 109 nom de thread: Proxy 3 ID de thread: 13 gentest :: Tickets restants: 0 ThreadSample $ 2 # sendResult: 110 nom de thread: Proxy 3 ID de thread: 13 gentest :: Proxy 1 Résultat des ventes: 2 ThreadSample $ 2 # sendResult: 111 nom de thread: Proxy 3 ID de thread: 13 gentest :: Proxy 2 Résultat des ventes: 2 ThreadSample $ 2 # sendResult: 112 nom de thread: Proxy 3 ID de thread: 13 gentest :: Proxy 3 Sales Résultat: 1

Recommended Posts

[Java] Thread et exécutable
Thread de programmation Java exécutable
Traitement des threads Java
Java et JavaScript
XXE et Java
Java vrai et faux
[Java] Comparaison des chaînes de caractères et && et ||
Java - Sérialisation et désérialisation
[Java] Arguments et paramètres
Résumé des threads sûrs ~ Java ~
timedatectl et Java TimeZone
[Java] Branchement et répétition
[Java] Types de variables et types
java (classe et instance)
[Java] Surcharge et remplacement
Etudier Java # 2 (\ marque et opérateur)
Java version 8 et fonctionnalités ultérieures
[Java] Nouvelle méthode de génération de threads (2)
[Java] Différence entre == et égal
[Java] Zone de pile et zone statique
[Java] Classe générique et méthode générique
Programmation Java (variables et données)
Cryptage et décryptage Java PDF
Java et Iterator Part 1 External Iterator Edition
Instructions Java if et switch
Définition et instanciation de classe Java
Apache Hadoop et Java 9 (partie 1)
[Java] À propos de String et StringBuilder
[Java] HashCode et remplacement égal
☾ Instruction Java / Repeat et instruction de contrôle de répétition
Java thread sans danger pour vous
Méthodes Java et surcharges de méthodes
java Generics T et? Différence
Avantages et inconvénients de Java
java (branchement conditionnel et répétition)
À propos du package Java et de l'importation
[Java] Téléchargez une image et convertissez-la en Base64
Thread Java pour comprendre vaguement
Histoire de remplacement C # et Java
Méthodes et classes abstraites Java
Instructions Java while et for
Encapsulation Java et getters et setters
[Java] Nouvelle méthode de génération de threads (1)
Implémentez Thread en Java et essayez d'utiliser la classe anonyme Lambda
J'ai comparé les constructeurs PHP et Java
Différences entre Java "débutant" et Kotlin
Utiliser java avec MSYS et Cygwin
Traçage distribué avec OpenCensus et Java
[Java] Différence entre Hashmap et HashTable
Déclaration, initialisation et types de variables Java
Insertion Java Excel et extraction d'images
Installez Java et Tomcat avec Ansible
SDK AWS pour Java 1.11.x et 2.x
[Java] Types de base et notes d'instructions
Date de sortie de Java et résumé EOL
Java et fonctions principales - au-delà de l'interface fonctionnelle -
À propos de Biocontainers fastqc et Java
Java pour les débutants, les expressions et les opérateurs 1
Série Java Primer (variations et types)
Exemple d'encodage et de décodage en Java
[Java débutant] À propos de l'abstraction et de l'interface