Kann jemand ein Beispielprogramm nennen, das Java-Threads auf einfache Weise erklärt? Zum Beispiel, sagen wir, ich habe drei Threads t1
, t2
y t3
. Ich möchte einen Code, der zeigt, dass die Threads gleichzeitig und nicht sequentiell ausgeführt werden.
Antworten
Zu viele Anzeigen?Hier ein einfaches Beispiel:
ThreadTest.java
public class ThreadTest
{
public static void main(String [] args)
{
MyThread t1 = new MyThread(0, 3, 300);
MyThread t2 = new MyThread(1, 3, 300);
MyThread t3 = new MyThread(2, 3, 300);
t1.start();
t2.start();
t3.start();
}
}
MeinThread.java
public class MyThread extends Thread
{
private int startIdx, nThreads, maxIdx;
public MyThread(int s, int n, int m)
{
this.startIdx = s;
this.nThreads = n;
this.maxIdx = m;
}
@Override
public void run()
{
for(int i = this.startIdx; i < this.maxIdx; i += this.nThreads)
{
System.out.println("[ID " + this.getId() + "] " + i);
}
}
}
Und etwas Output:
[ID 9] 1
[ID 10] 2
[ID 8] 0
[ID 10] 5
[ID 9] 4
[ID 10] 8
[ID 8] 3
[ID 10] 11
[ID 10] 14
[ID 10] 17
[ID 10] 20
[ID 10] 23
Eine Erklärung - Jeder MyThread
Objekt versucht, Zahlen von 0 bis 300 zu drucken, aber sie sind nur für bestimmte Bereiche dieses Bereichs zuständig. Ich habe mich für eine Aufteilung nach Indizes entschieden, wobei jeder Thread um die Gesamtzahl der Threads vorausspringt. Also t1
hat den Index 0, 3, 6, 9, usw.
Ohne IO können triviale Berechnungen wie diese immer noch siehe als ob die Threads sequentiell ausgeführt werden, weshalb ich nur den ersten Teil der Ausgabe gezeigt habe. Auf meinem Computer wird nach dieser Ausgabe der Thread mit der ID 10 auf einmal beendet, gefolgt von 9 und dann 8. Wenn Sie eine Wartezeit oder ein Yield einfügen, können Sie es besser sehen:
MeinThread.java
System.out.println("[ID " + this.getId() + "] " + i);
Thread.yield();
Und die Ausgabe:
[ID 8] 0
[ID 9] 1
[ID 10] 2
[ID 8] 3
[ID 9] 4
[ID 8] 6
[ID 10] 5
[ID 9] 7
Jetzt können Sie sehen, wie jeder Thread ausgeführt wird, die Kontrolle frühzeitig abgibt und der nächste ausgeführt wird.
Es gibt keine Garantie dafür, dass Ihre Threads gleichzeitig ausgeführt werden, unabhängig von jedem trivialen Beispiel, das jemand anderes einstellt. Wenn Ihr Betriebssystem dem Java-Prozess nur einen Prozessor zur Verfügung stellt, werden Ihre Java-Threads trotzdem für jede Zeitscheibe nach dem Round-Robin-Prinzip eingeplant. Das heißt, es werden nie zwei gleichzeitig ausgeführt, aber die Arbeit, die sie verrichten, wird verschachtelt sein. Sie können Überwachungstools wie die Java Visual VM (Standard im JDK) verwenden, um die Threads zu beobachten, die in einem Java-Prozess ausgeführt werden.
Ein einfaches Beispiel:
public class Test extends Thread {
public synchronized void run() {
for (int i = 0; i <= 10; i++) {
System.out.println("i::"+i);
}
}
public static void main(String[] args) {
Test obj = new Test();
Thread t1 = new Thread(obj);
Thread t2 = new Thread(obj);
Thread t3 = new Thread(obj);
t1.start();
t2.start();
t3.start();
}
}
Erstellen Sie eine Java-Anwendung, in der Sie zwei Threads definieren, nämlich t1 und t2. Der Thread t1 wird die Zufallszahlen 0 und 1 erzeugen (simulieren Sie den Wurf einer Münze). 0 bedeutet Kopf und eins bedeutet Schwanz. der andere Thread t2 wird das gleiche tun t1 und t2 wird diese Schleife 100 Mal wiederholen und schließlich sollte Ihre Anwendung bestimmen, wie oft t1 die von t2 generierte Zahl errät und dann die Punktzahl anzeigen. zum Beispiel, wenn Thread t1 20 von 100 Zahlen errät, dann ist die Punktzahl von t1 20/100 =0,2, wenn t1 100 Zahlen errät, dann bekommt er die Punktzahl 1 und so weiter