Ein Artikel, um zu verstehen, wie man Threads in Java versteht
WBOY
Freigeben: 2022-07-18 13:45:58
nach vorne
1219 Leute haben es durchsucht
Dieser Artikel vermittelt Ihnen relevantes Wissen über Java, das hauptsächlich Probleme im Zusammenhang mit Threads organisiert. Die Hauptmethode, mit der wir vertraut sind, ist eigentlich ein separater Ausführungspfad Wenn es einen Ausführungspfad im Programm gibt, ist das Programm ein Single-Thread-Programm. Ich hoffe, es wird für alle hilfreich sein.
Thread ist ein Ausführungspfad innerhalb eines Programms, wenn es nur einen Ausführungspfad im Programm gibt Dann ist dieses Programm ein „Single-Thread-Programm“; da es einen einzelnen Thread gibt, gibt es auch Multi-Threading. Die wörtliche Bedeutung kann als „eine Technologie, die mehrere Prozesse auf Software und Hardware relativ zu einem einzelnen Thread ausführt“ verstanden werden .“ Die Vorteile von Multithreading sind Verbesserung der CPU-Auslastung. Wenn in einem Multithread-Programm ein Thread warten muss, kann die CPU andere Threads ausführen, anstatt zu warten, was die Effizienz des Programms erheblich verbessert. Erstellung von Multi-Threads
Methode 1: Erben Sie die Thread-Klasse
Methode 1-Erstellungsprozess:
Definieren Sie eine Unterklasse MyThread, um die Thread-Klasse java.lang.Thread zu erben und die run()-Methode zu überschreiben;
Erstellen Sie ein Objekt der MyThread-Klasse.
Rufen Sie die start()-Methode des Thread-Objekts auf, um den Thread zu starten (die run()-Methode wird nach dem Start weiterhin ausgeführt).
public class ThreadDemo01 {
public static void main(String[] args) {
MyThread myThread1 = new MyThread();
myThread1.start();
for (int i = 0; i < 3; i++) {
System.out.println("主线程正在执行~~");
}
}
}
class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println("子线程正在执行~~");
}
}
}
//输出结果(不唯一):
//主线程正在执行~~
//主线程正在执行~~
//主线程正在执行~~
//子线程正在执行~~
//子线程正在执行~~
//子线程正在执行~~
Nach dem Login kopieren
Es gibt zwei Threads, die im obigen Code ausgeführt werden, nämlich main Der Hauptthread der Methode und der untergeordnete Thread, der durch Aufrufen von start() für das Thread-Objekt mythread gestartet wird. Aber warum ist das Ausgabeergebnis nicht eindeutig? Der Grund dafür ist, dass während der Ausführung eine CPU-Präemption zwischen den beiden Threads stattfindet und derjenige, der sie zuerst nutzt, zuerst ausgeführt wird.
Warum verwenden wir also nicht direkt das Thread-Objekt, um die run()-Methode aufzurufen? Wenn run() direkt aufgerufen wird, handelt es sich nur um eine normale Aufrufmethode, also um einen einzelnen Thread, während die start()-Methode zum Starten untergeordneter Threads verwendet wird, sodass Multithreading auftreten kann.
Vor- und Nachteile der ersten Methode:
Vorteile: Einfache Codierung;
Nachteile: Die Thread-Klasse hat Thread geerbt und kann keine anderen Klassen erben, was der Erweiterung nicht förderlich ist;
Methode zwei: Implementieren Sie die Runnable-Schnittstelle
Methode zwei Erstellungsprozess:
1. Definieren Sie eine Thread-Task-Klasse MyRunnable, um die run()-Methode zu überschreiben.
3. Übergeben Sie das MyRunnable-Task-Objekt zur Verarbeitung;
4. Rufen Sie das Thread-Objekt auf. Die start()-Methode startet den Thread.
Methode
öffentlicher Thread (String-Name)
öffentlicher Thread (ausführbares Ziel)
kapselt das ausführbare Objekt und wird zu einem Thread-Objekt
public class ThreadDemo02 {
public static void main(String[] args) {
MyRunnable target = new MyRunnable();
Thread thread = new Thread(target);
thread.start();
for (int i = 0; i < 3; i++) {
System.out.println("主线程正在执行~~");
}
}
}
class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println("子线程正在执行~~");
}
}
}
//输出结果(不唯一):
//主线程正在执行~~
//子线程正在执行~~
//子线程正在执行~~
//子线程正在执行~~
//主线程正在执行~~
//主线程正在执行~~
//正常版:
public class ThreadDemo01 {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println("子线程正在执行~~");
}
}
});
thread.start();
for (int i = 0; i < 3; i++) {
System.out.println("主线程正在执行~~");
}
}
}
//lambda简化版:
new Thread(()-> {
for (int i = 0; i < 3; i++) {
System.out.println("子线程正在执行~~");
}
}).start();
public class ThreadDemo03 {
public static void main(String[] args) throws Exception {
MyCallable myCallable = new MyCallable();
FutureTask<String> futureTask = new FutureTask<>(myCallable);
Thread thread = new Thread(futureTask);
thread.start();
int sum= 0;
for (int i = 0; i < 3; i++) {
sum+=i;
}
System.out.println(sum);
String s =futureTask.get();
System.out.println(s);
}
}
class MyCallable implements Callable<String > {
@Override
public String call(){
int sum=0;
for (int i = 0; i < 3; i++) {
sum+=i;
}
return "子线程计算结果:"+sum;
}
}
//输出结果:
//3
//子线程计算结果:3
Nach dem Login kopieren
方式三优缺点:
优点:
线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强;
可以在线程执行完毕后去获取 线程执行的结果;
缺点:
编码复杂一点;
总结
方式
优点
缺点
继承Thread类
编程比较简单,可以直接使用Thread类中的方法
扩展性较差,不能再继承其他的类,不能返回线程执行的结果
实现Runnable接口
扩展性强,实现该接口的同时还可以继承其他的类
编程相对复杂,不能返回线程执行的结果
实现Callable接口
扩展性强,实现该接口的同时还可以继承其他的类,可以得到线程的执行结果
编程相对复杂
常用方法
Thread获取和设置线程名称
方法名称
说明
String getName()
获取当前线程的名称,默认线程名称是Thread-索引
void setName(String name)
将此线程更改为指定的名称,通过构造器也可以设置线程名称
简单地通过一段代码让大家能够清晰地了解这个代码该如何使用:
public class ThreadDemo04 {
public static void main(String[] args) throws Exception {
thread thread1 = new thread();
thread1.setName("1号子线程");
thread1.start();
thread thread2 = new thread();
thread2.setName("2号子线程");
thread2.start();
}
}
class thread extends Thread {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(this.getName()+"正在执行任务"+i);
}
}
}
//输出结果:
//2号子线程正在执行任务0
//1号子线程正在执行任务0
//2号子线程正在执行任务1
//1号子线程正在执行任务1
//2号子线程正在执行任务2
//1号子线程正在执行任务2
Nach dem Login kopieren
Thread类的线程休眠方法
方法名称
说明
public static void sleep(long time)
让当前线程休眠指定的时间后再继续执行,单位为毫秒
public class ThreadDemo05 {
public static void main(String[] args) throws Exception {
for (int i = 0; i < 5; i++) {
System.out.println(i);
if (i==3){
Thread.sleep(5000);
}
}
}
}
//输出结果:
//1
//2
//3
//在输出过3以后,等待5秒之后再进行输出
//4
Das obige ist der detaillierte Inhalt vonEin Artikel, um zu verstehen, wie man Threads in Java versteht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn