Java线程教程:使用Java创建线程和多线程


与许多其他计算机语言不同,Java提供了对多线程的内置支持。Java中的多线程包含两个或多个可以同时运行的部分。Java线程实际上是一个轻量级进程。

本文将向您介绍许多人发现棘手或难以理解的所有Java Thread概念。

我将介绍以下主题:

  1. 什么是Java线程?
  2. Java线程模型
  3. Java多线程
  4. Java主线程
  5. 如何创建Java线程?

在继续第一个主题之前,请考虑以下示例:

想象一下具有许多复杂功能的股票经纪人应用程序,例如

  • 下载最后的股价
  • 查看价格以获取警告
  • 分析特定公司的历史数据 这些是耗时的功能。在单线程运行时环境中,这些操作将一个接一个地执行。仅当上一个操作完成后,才能执行下一个操作。

如果历史分析需要半小时,并且用户选择执行下载并事后检查,则警告可能来不及买卖股票。这是一种需要多线程处理的应用程序。理想情况下,下载应在后台(即在另一个线程中)进行。这样,其他进程可能会同时发生,从而例如可以立即传达警告。一直以来,用户正在与应用程序的其他部分进行交互。分析也可能在单独的线程中进行,因此用户可以在计算结果的同时使用应用程序的其余部分。

这是Java线程提供帮助的地方。

什么是Java线程?

线程实际上是一个轻量级进程。与许多其他计算机语言不同,Java为多线程编程提供了内置支持。多线程程序包含两个或多个可以同时运行的部分。这样的程序的每个部分都称为线程,每个线程定义执行的单独路径。因此,多线程是多任务的一种特殊形式。

Java线程模型

Java运行时系统在很多方面都依赖于线程。线程通过防止浪费CPU周期来降低效率。

线程以几种状态存在:

  • 新建-当我们创建Thread类的实例时,线程处于新状态。
  • 正在运行-Java线程处于运行状态。
  • 已挂起-正在运行的线程可以被挂起,这会暂时挂起其活动。然后可以恢复被挂起的线程,使它可以从* 中断的地方继续。
  • 已阻止-等待资源时可以阻止Java线程。
  • 已终止-线程可以终止,这可以在任何给定时间立即停止执行。线程终止后,将无法恢复。

blog-1.png 现在,让我们跳到Java线程最重要的主题:线程类和可运行接口。

Java中的多线程:线程类和可运行接口

Java的多线程系统基于Thread类,其方法以及其伴随接口Runnable构建。要创建一个新的线程,你的程序将可以扩展主题或实施的Runnableinterface。

Thread类定义了几种有助于管理线程的方法:

2.png

现在,让我们看看如何使用以所有Java程序具有的主要Java线程开头的Thread 。

Java主线程

在这里,我将向您展示如何使用Thread和Runnable接口来创建和管理线程,从Java主线程开始。

为什么主线程如此重要?

  • 因为它影响其他“子”线程。
  • 因为它执行各种关闭操作。
  • 因为它是在程序启动时自动创建的。

如何创建Java线程

Java使您可以通过以下两种方式之一创建线程:

  • 通过实施该Runnableinterface。
  • 通过扩展的主题。

让我们看一下这两种方式如何帮助实现Java线程。

可运行的界面

创建线程的最简单方法是创建一个实现Runnable接口的类。

为了实现Runnable接口,一个类仅需要实现一个名为run()的方法,该方法的声明如下:

public void run( )

在run()内部,我们将定义构成新线程的代码。例子:

public class MyClass implements Runnable {
public void run(){
System.out.println("MyClass running");
   } 
}

要通过线程执行run()方法,请将MyClass的实例传递给其构造函数中的Thread(Java中的构造函数是类似于在创建对象实例时调用的方法的代码块)。这是如何完成的:

Thread t1 = new Thread(new MyClass ());
t1.start();

当线程启动时,它将调用MyClass实例的run()方法,而不是执行自己的run()方法。上面的示例将打印出文本“ MyClass running ”。

扩展Java线程

创建线程的第二种方法是创建一个扩展Thread的新类,然后重写run()方法,然后创建该类的实例。调用start()后,线程将执行run()方法。这是创建Java Thread子类的示例:

public class MyClass extends Thread {
     public void run(){
     System.out.println("MyClass running");
   }
}

创建并启动上述线程:

MyClass t1 = new MyClass ();
T1.start();

当run()方法执行时,它将打印出文本“ MyClass running ”。

到目前为止,我们仅使用了两个线程:主线程和一个子线程。但是,我们的程序可以影响所需数量的线程。让我们看看如何创建多个线程。

创建多个线程

class MyThread implements Runnable {
String name;
Thread t;
    MyThread String thread){
    name = threadname; 
    t = new Thread(this, name);
System.out.println("New thread: " + t);
t.start();
}


public void run() {
 try {
     for(int i = 5; i > 0; i--) {
     System.out.println(name + ": " + i);
      Thread.sleep(1000);
}
}catch (InterruptedException e) {
     System.out.println(name + "Interrupted");
}
     System.out.println(name + " exiting.");
}
}

class MultiThread {
public static void main(String args[]) {
     new MyThread("One");
     new MyThread("Two");
     new NewThread("Three");
try {
     Thread.sleep(10000);
} catch (InterruptedException e) {
      System.out.println("Main thread Interrupted");
}
      System.out.println("Main thread exiting.");
      }
}

该程序的输出如下所示:

New thread: Thread[One,5,main]
New thread: Thread[Two,5,main]
New thread: Thread[Three,5,main]
One: 5
Two: 5
Three: 5
One: 4
Two: 4
Three: 4
One: 3
Three: 3
Two: 3
One: 2
Three: 2
Two: 2
One: 1
Three: 1
Two: 1
One exiting.
Two exiting.
Three exiting.
Main thread exiting.

这就是Java中的多线程工作方式。我希望这对您有所帮助。在我的Java教程博客系列的下一篇文章中,您将了解Java集合。


原文链接:https://blog.csdn.net/Beibnjin/article/details/113827586?utm_medium=distribute.pc_category.none-task-blog-hot-1.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-1.nonecase&request_id=