[Java] Thread und ausführbar

Schritt 1, Programm unter der Annahme eines Ticketverkaufs

1.1 Mythread erstellen

1.2 Starten Sie von der Hauptfunktion

Unten ist ein Beispiel

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) {

// TODO automatisch generierter Fangblock e.printStackTrace(); } if(ticket > 0 ) { ticket--; L.d ("Die Anzahl der verbleibenden Tickets ist" + Ticket + ""); } } } }

public class ThreadSample {

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

L.d ("Ticketverkaufsstart"); mythread.start(); } }

Ergebnis: ThreadSample # main: 34 Threadname: main thread id: 1 gentest :: Ticketverkaufsstart Mythread # run: 24 Threadname: Thread-0 Thread-ID: 11 Gentest :: 4 Tickets übrig Mythread # run: 24 Threadname: Thread-0 Thread-ID: 11 Gentest :: 3 Tickets übrig Mythread # run: 24 Threadname: Thread-0 Thread-ID: 11 Gentest :: 2 Tickets übrig Mythread # run: 24 Threadname: Thread-0 Thread-ID: 11 Gentest :: 1 Ticket übrig Mythread # run: 24 Threadname: Thread-0 Thread-ID: 11 Gentest :: 0 Tickets übrig

Schritt 2, Bericht hinzufügen (Rückruf), nachdem der Ticketverkauf abgeschlossen ist

2.1 Schnittstelle erstellen

2.2 Realisierung der Schnittstelle in der Hauptklasse

2.3 Mythread-Konstruktor hinzugefügt

2.4 Rückruf zum Mythread-Lauf hinzufügen

Unten ist ein Beispiel

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) {

// TODO automatisch generierter Fangblock e.printStackTrace(); } if(ticket > 0 ) { ticket--; L.d ("Die Anzahl der verbleibenden Tickets ist" + 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 ("Ticketverkaufsstart"); mythread.start(); } static MyTaskResult myTaskResult = new MyTaskResult() {

		@Override
		public void ticketSoldout() {

L.d ("Danke für Ihre harte Arbeit."); }

		@Override
		public void ticketRemain() {

L.d ("Ist es nicht vorbei?"); } }; }

Ergebnis ist

ThreadSample # main: 43 Threadname: main thread id: 1 gentest :: Ticketverkaufsstart Mythread # run: 28 Threadname: Thread-0 Thread-ID: 11 Gentest :: 4 Tickets übrig Mythread # run: 28 Threadname: Thread-0 Thread-ID: 11 Gentest :: 3 Tickets übrig Mythread # run: 28 Threadname: Thread-0 Thread-ID: 11 Gentest :: 2 Tickets übrig Mythread # run: 28 Threadname: Thread-0 Thread-ID: 11 Gentest :: 1 Ticket übrig Mythread # run: 28 Threadname: Thread-0 Thread-ID: 11 Gentest :: 0 Tickets übrig ThreadSample $ 1 # ticketSoldout: 50 Threadname: Thread-0 Thread-ID: 11 Gentest :: Danke.

Schritt 3: Verkaufen Sie Tickets an mehreren Ticketautomaten

3.1 Hinzufügen von Runnable (TicketBox)

3.2 Hinzufügen der Anzahl der Threads, Hinzufügen des Threadnamens (Ersatz 1, 2, 3)

Unten ist ein Beispiel

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) {

// TODO automatisch generierter Fangblock e.printStackTrace(); } if(ticket > 0 ) { ticket--; L.d ("Die Anzahl der verbleibenden Tickets ist" + Ticket + ""); } } L.d ("Abgeschlossenes Ticket:" + 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 = neuer Mythread (ticketBox, myTaskResult, "Proxy 1"); Mythread mythread2 = neuer Mythread (ticketBox, myTaskResult, "Proxy 2"); Mythread mythread3 = neuer Mythread (ticketBox, myTaskResult, "Proxy 3"); L.d ("Ticketverkaufsstart"); mythread1.start(); mythread2.start(); mythread3.start(); } static MyTaskResult myTaskResult = new MyTaskResult() {

		@Override
		public void ticketSoldout(String threadName) {

L.d ("Danke für deine harte Arbeit." + ThreadName); }

		@Override
		public void ticketRemain(String threadName) {

L.d ("Ist es nicht vorbei?" + ThreadName); } }; }

Ergebnis

ThreadSample # main: 52 Threadname: main thread id: 1 gentest :: Ticketverkaufsstart TicketBox # run: 23 Threadname: Proxy 2 Thread-ID: 12 Gentest :: 3 Tickets übrig TicketBox # run: 23 Threadname: Proxy 1 Thread-ID: 11 Gentest :: 3 Tickets übrig TicketBox # run: 23 Threadname: Proxy 3 Thread-ID: 13 Gentest :: 3 Tickets übrig TicketBox # run: 23 Threadname: Proxy 1 Thread-ID: 11 Gentest :: 2 Tickets übrig TicketBox # run: 23 Threadname: Proxy 2 Thread-ID: 12 Gentest :: 1 verbleibendes Ticket TicketBox # run: 23 Threadname: Proxy 3 Thread-ID: 13 Gentest :: 0 verbleibende Tickets TicketBox # run: 26 Threadname: Proxy 2 Thread-ID: 12 Gentest :: Abgeschlossene verbleibende Tickets: 0 TicketBox # run: 26 Threadname: Proxy 3 Thread-ID: 13 Gentest :: Abgeschlossene verbleibende Tickets: 0 TicketBox # run: 26 Threadname: Proxy 1 Thread-ID: 11 Gentest :: Abgeschlossene verbleibende Tickets: 0

Problem:

  1. Ich habe 6 mal für 5 Tickets verkauft. (Synchronisation erforderlich)
  2. Jede Agentur gibt nicht an, wie viele Exemplare veröffentlicht wurden

Schritt 4 Synchrone Verarbeitung

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) {

// TODO automatisch generierter Fangblock e.printStackTrace(); } saleTicket(); } L.d ("Restliches Ticket abgeschlossen:" + Ticket); } private synchronized void saleTicket() { if(ticket > 0 ) { ticket--; L.d ("Die Anzahl der verbleibenden Tickets ist" + Ticket + ""); } } }

Ergebnis

ThreadSample # main: 55 Threadname: main thread id: 1 gentest :: Ticketverkaufsstart TicketBox # saleTicket: 28 Thread-Name: Proxy 2 Thread-ID: 12 Gentest :: 4 Tickets übrig TicketBox # saleTicket: 28 Threadname: Proxy 3 Thread-ID: 13 Gentest :: 3 Tickets übrig TicketBox # saleTicket: 28 Thread-Name: Proxy 1 Thread-ID: 11 Gentest :: 2 Tickets übrig TicketBox # saleTicket: 28 Thread-Name: Proxy 2 Thread-ID: 12 Gentest :: 1 verbleibendes Ticket TicketBox # saleTicket: 28 Thread-Name: Proxy 1 Thread-ID: 11 Gentest :: 0 Tickets übrig TicketBox # run: 23 Threadname: Proxy 2 Thread-ID: 12 Gentest :: Abgeschlossene verbleibende Tickets: 0 TicketBox # run: 23 Threadname: Proxy 3 Thread-ID: 13 gentest :: Restliche Tickets abgeschlossen: 0 TicketBox # run: 23 Threadname: Proxy 1 Thread-ID: 11 gentest :: Restliche Tickets abgeschlossen: 0

Schritt 5 Zusammenfassung der Verkaufsergebnisse

Siehe github

Ergebnis

ThreadSample # main: 85 Threadname: main thread id: 1 gentest :: Ticketverkaufsstart TicketBox # saleTicket: 52 Threadname: Proxy 2 Thread-ID: 12 Gentest :: 4 Tickets übrig TicketBox # saleTicket: 52 Threadname: Proxy 1 Thread-ID: 11 Gentest :: 3 Tickets übrig TicketBox # saleTicket: 52 Threadname: Proxy 3 Thread-ID: 13 Gentest :: 2 Tickets übrig TicketBox # saleTicket: 52 Threadname: Proxy 1 Thread-ID: 11 Gentest :: 1 Ticket übrig TicketBox # saleTicket: 52 Threadname: Proxy 2 Thread-ID: 12 Gentest :: 0 Tickets übrig ThreadSample $ 1 # taskDone: 95 Threadname: Proxy 1 Thread-ID: 11 Gentest :: Danke. Stellvertreter 1 ThreadSample $ 1 # taskDone: 95 Threadname: Proxy 2 Thread-ID: 12 Gentest :: Danke. Ersatz 2 ThreadSample $ 1 # taskDone: 95 Threadname: Proxy 3 Thread-ID: 13 Gentest :: Vielen Dank für Ihre Arbeit. Stellvertreter 3 ThreadSample $ 1 # taskDone: 100 Threadname: Proxy 3 Thread-ID: 13 Gentest :: ---------------- Alle abgeschlossenen Berichte ------------- --------------- ThreadSample $ 2 # sendResult: 108 Threadname: Proxy 3 Thread-ID: 13 Gentest :: Gesamtzahl der Tickets: 5 ThreadSample $ 2 # sendResult: 109 Threadname: Proxy 3 Thread-ID: 13 Gentest :: Verbleibende Tickets: 0 ThreadSample $ 2 # sendResult: 110 Threadname: Proxy 3 Thread-ID: 13 Gentest :: Proxy 1 Verkaufsergebnis: 2 ThreadSample $ 2 # sendResult: 111 Threadname: Proxy 3 Thread-ID: 13 Gentest :: Proxy 2 Verkaufsergebnis: 2 ThreadSample $ 2 # sendResult: 112 Threadname: Proxy 3 Thread-ID: 13 Gentest :: Proxy 3 Verkaufsergebnis: 1

Recommended Posts

[Java] Thread und ausführbar
Java Programming Thread Runnable
Java-Thread-Verarbeitung
Java und JavaScript
XXE und Java
Java wahr und falsch
[Java] Vergleich von Zeichenketten und && und ||
Java - Serialisierung und Deserialisierung
[Java] Argumente und Parameter
Thread sichere Zusammenfassung ~ Java ~
timedatectl und Java TimeZone
[Java] Verzweigen und Wiederholen
[Java] Variablen- und Typtypen
Java (Klasse und Instanz)
[Java] Überladen und überschreiben
Studiere Java # 2 (\ mark and operator)
Java Version 8 und neuere Funktionen
[Java] Neue Thread-Generierungsmethode (2)
[Java] Unterschied zwischen == und gleich
[Java] Stapelbereich und statischer Bereich
[Java] Generics-Klasse und Generics-Methode
Java-Programmierung (Variablen und Daten)
Java-Ver- und Entschlüsselung PDF
Java und Iterator Teil 1 Externe Iterator Edition
Java if- und switch-Anweisungen
Definition und Instanziierung von Java-Klassen
Apache Hadoop und Java 9 (Teil 1)
[Java] Über String und StringBuilder
[Java] HashCode und gleich Überschreibung
☾ Java / Repeat-Anweisung und Repeat-Steueranweisung
Java-Thread sicher für Sie
Java-Methoden und Methodenüberladungen
Java Generics T und? Unterschied
Vor- und Nachteile von Java
Java (bedingte Verzweigung und Wiederholung)
Über Java-Paket und Import
[Java] Laden Sie ein Bild hoch und konvertieren Sie es in Base64
Java-Thread locker zu verstehen
C # und Java überschreiben Story
Java abstrakte Methoden und Klassen
Java während und für Anweisungen
Java-Kapselung und Getter und Setter
[Java] Neue Thread-Generierungsmethode (1)
Implementieren Sie Thread in Java und versuchen Sie, die anonyme Klasse Lambda zu verwenden
Ich habe PHP- und Java-Konstruktoren verglichen
Unterschiede zwischen "Anfänger" Java und Kotlin
Verwenden Sie Java mit MSYS und Cygwin
Verteilte Ablaufverfolgung mit OpenCensus und Java
[Java] Unterschied zwischen Hashmap und HashTable
Deklaration, Initialisierung und Typen von Java-Variablen
Java Excel Insertion und Bildextraktion
Installieren Sie Java und Tomcat mit Ansible
AWS SDK für Java 1.11.x und 2.x.
[Java] Grundtypen und Anweisungshinweise
Java-Veröffentlichungsdatum und EOL-Zusammenfassung
Java und primäre Funktionen - jenseits funktionaler Schnittstellen -
Über Biocontainer fastqc und Java
Java für Anfänger, Ausdrücke und Operatoren 1
Java Primer Series (Variationen und Typen)
Beispiel für Codierung und Decodierung in Java
[Java-Anfänger] Über Abstraktion und Schnittstelle