In diesem Artikel werden hauptsächlich relevante Informationen zu den drei Konstruktionsmethoden von Java Multi-Threading vorgestellt. Ich hoffe, dass jeder, der dies benötigt, darauf zurückgreifen kann
Drei Konstruktionsmethoden für Java-MultithreadingErben Sie die Thread-Klasse, um eine Thread-Klasse zu erstellen
public class Thread extends Object implements Runnable
public class FirstThread extends Thread { public void run(){ for(int i=0;i<100;i++){ /* * Thread类已经继承了Object * Object类创建了name选项 并且有其getName(),setName()方法 * 在继承Thread的类里面使用时只需要用this引用 */ System.out.println(this.getName()+" "+i); } } public static void main(String[] args) { for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+" "+i); if(i==20){ new FirstThread().start(); new FirstThread().start(); } } } }
Die Object-Klasse erstellt die Namensoption und verfügt über ihre getName()- und setName()-Methoden
Bei Verwendung in a Klasse, die Thread erbt, Sie müssen nur diese Referenz verwenden
Die beiden oben genannten sekundären Threads und der Hauptthread werden zufällig gewechselt, und da die Klasse verwendet wird, die Thread erbt, können die beiden sekundären Threads keine Ressourcen gemeinsam nutzen
Nachdem die Methode start() aufgerufen wurde, wird der Multithread-Code nicht sofort ausgeführt, sondern der Zustand der Thread-Programmierung wird durch das Betriebssystem bestimmtpublic Thread() public Thread(Runnable target) public Thread(Runnable target,String name)
public class SecondThread implements Runnable { public void run(){ for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+" "+i); } } public static void main(String[] args) { for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+" "+i); if(i==20){ SecondThread st=new SecondThread(); //通过new Thread(target,name)创建线程 new Thread(st,"新线程1").start(); new Thread(st,"新线程2").start(); } } } }
Erben Erstellen Sie die Thread-Klasse und erstellen Sie eine detaillierte Erklärung der gemeinsam genutzten Ressourcen der Runnable-Schnittstelle
Wenn nur Ressourcen gemeinsam genutzt werden können, wird dasselbe Instanziierungsobjekt verwendet. Die beiden Erstellungsmethoden unterscheiden sich nur, wenn sie Ressourcen gemeinsam nutzen. Andernfalls werden gemeinsam genutzte Ressourcen normalerweise mit dem privaten statischen Modifikator geändert.
class Thread1 extends Thread{ private int count=5; private String name; public Thread1(String name) { this.name=name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 count= " + count--); try { sleep((int) Math.random() * 10); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { Thread1 mTh1=new Thread1("A"); Thread1 mTh2=new Thread1("B"); mTh1.start(); mTh2.start(); } }
B运行 count= 5 A运行 count= 5 B运行 count= 4 B运行 count= 3 B运行 count= 2 B运行 count= 1 A运行 count= 4 A运行 count= 3 A运行 count= 2 A运行 count= 1
class Thread2 implements Runnable{ private int count=15; public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "运行 count= " + count--); try { Thread.sleep((int) Math.random() * 10); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { Thread2 my = new Thread2(); new Thread(my, "C").start();//同一个mt,但是在Thread中就不可以,如果用同一个实例化对象mt,就会出现异常 new Thread(my, "D").start(); new Thread(my, "E").start(); } }
C运行 count= 15 D运行 count= 14 E运行 count= 13 D运行 count= 12 D运行 count= 10 D运行 count= 9 D运行 count= 8 C运行 count= 11 E运行 count= 12 C运行 count= 7 E运行 count= 6 C运行 count= 5 E运行 count= 4 C运行 count= 3 E运行 count= 2
Warum gibt es also Unterschiede bei der Ressourcenfreigabe zwischen Unterklassen, die die Thread-Klasse erben und die Runable-Schnittstelle implementieren?
Da Java nur die Einzelvererbung unterstützen kann, bedeutet die Einzelvererbungsfunktion, dass nur eine Unterklasse erben kann und der Runnabl-Schnittstelle viele Klassen folgen können, sodass mehrere Threads eine Ressource teilen können
Callable sieht aus wie eine erweiterte Version der Runnable-Schnittstelle und verfügt über eine call()-Methode, die Runnable entspricht Die run()-Methode, aber die Funktion ist leistungsfähiger:
Die call()-Methode kann einen Rückgabewert haben
Die call()-Methode kann deklarieren, dass sie eine Ausnahme auslöst
public class ThirdThread implements Callable<Integer> { public Integer call(){ int i=0; for(;i<100;i++){ System.out.println(Thread.currentThread().getName()+" "+i); } return i; } public static void main(String[] args){ ThirdThread tt=new ThirdThread(); FutureTask<Integer> task=new FutureTask<>(tt); Thread t=new Thread(task,"有返回值的线程"); for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+" "+i); if(i==20){ t.start(); } } try{ System.out.println("返回值是:"+task.get()); }catch(Exception e){ e.printStackTrace(); } } }
Das obige ist der detaillierte Inhalt vonTeilen Sie drei Möglichkeiten zum Erstellen von Multithreading in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!