学习Java中的多线程

72 阅读4分钟

Java中的多线程

Java中的线程是一个小而轻的进程。许多线程可以在一个进程中运行,每个线程必须是一个进程的一部分,因为它不能独立存在。

多线程

多线程是指同时执行许多线程的过程。它能确保CPU得到最大程度的利用。这意味着,一个进程可以同时做许多任务。

例如,一个线程可以从数据库中读取数据,而另一个线程则同时将数据写入文件中。

多任务处理

多任务是指同时执行几个任务的过程。它有助于减少CPU的闲置时间。多任务处理的是多个进程同时执行多个任务,而多线程处理的是单个进程中的多个线程执行多个任务。

多线程的好处

  • 使我们能够同时执行两个或多个任务。
  • 线程是独立的,不会影响并发线程的性能。
  • 一个线程的执行不会打断其他线程。这对服务于多个客户、多人游戏或其他相互独立的任务很有帮助。
  • 我们可以把一个程序分成线程,并并行执行,从而提高程序的执行速度。

一个线程的生命周期

以下是一个线程在执行过程中所经历的步骤。

  1. New: 一个线程还没有开始执行。
  2. Runnable: 一个线程已经调用了start() 方法,但是还没有被分配到CPU。
  3. Running: 一个线程已经被分配到CPU上执行。
  4. Blocked: 如果一个线程被阻止进入可运行状态并进入运行状态,那么它就被称为处于阻塞状态。
  5. Terminated:一个线程已经完成了执行。

创建一个线程

我们可以使用以下两种方法来创建线程。

  1. 通过扩展 Thread类。
  2. 通过实现 Runnable接口。Java包含一个java.lang 包,提供一个Thread 类和Runnable 接口。

1.通过扩展线程类

使用这种方法创建的线程遵循以下语法。

public class Main extends Thread {
  public void run() {
    //statement
  }
}

public void run() 方法用于执行一个线程的任务。它包含要执行的代码。

2.通过实现Runnable

一个 "实现 "了Runnable 接口的线程遵循下面的语法。

public class Main implements Runnable {
  public void run() {
    //statement
  }
}

启动一个线程

我们使用start() 方法来启动一个线程。让我们在一个例子中使用start() 方法来启动一个线程。

  1. 通过扩展Thread通过扩展Thread 类,我们可以创建一个类的实例并调用start()方法。
public class Main extends Thread {
  public static void main(String[] args) {
    Main thread = new Main();    // creates the class instance
    thread.start();
  }
  public void run() {
    System.out.println("This is a running thread");
  }
}

一个Java程序的执行是从main 方法开始的。JVM创建一个线程来开始执行main 方法中的代码,它被称为主线程。其他线程是由主线程产生的,并且必须总是最后一个完成执行。

  1. 通过实现Runnable 接口我们使用new 关键字创建线程的实例。然后我们指定一个属于Thread 的子类,即Main ,作为new 关键字的参数。

然后,最后我们调用start() 方法。

public class Main implements Runnable {
  public static void main(String[] args) {
    Main obj = new Main();       // creates the class instance
    Thread t1 = new Thread(obj); // creates the thread instance
    t1.start();                  // starts the thread
  }
  public void run() {
    System.out.println("This is a running thread");
  }
}

isAlive()方法

isAlive() 方法是用来检查一个线程是否已经执行完毕。如果该线程仍在运行,它将返回true,否则返回false。如果我们在启动方法之前使用isAlive 方法,那么它将打印出false,但在启动方法之后,它将打印出true。

让我们看一个例子,我们使用Runnable 接口。

public class Main implements Runnable {
   public void run() {
      Thread t = Thread.currentThread();
      // checks if this thread is alive
      System.out.println(t.isAlive());
   }
   public static void main(String args[]) throws Exception {
      Thread t = new Thread(new Main());
      // this statement will call the run() method
      t.start();
      // makes the thread to sleep for 500 milliseconds
      t.sleep(500);
      // checks if this thread is alive
      System.out.println(t.isAlive());
   }
}

输出。

 true
 false

线程类中使用的常用方法

  1. public void run():用于执行某个线程的某个任务。
  2. public void start():一个线程的执行从这里开始。
  3. public void sleep(long milliseconds):使执行中的线程暂时休眠一段指定时间。
  4. public void join():用于等待一个线程完成其执行。
  5. public void join(long milliseconds):用于等待一个线程完成其执行,时间为指定的毫秒。
  6. public int setPriority(int priority):一个线程根据其优先级被分配到CPU上。每当我们创建一个线程,它就会被JVM分配优先级,或者我们可以使用setPriority(int priority) 方法直接分配。
  7. public int getPriority():一个线程的优先级由这个方法显示。
  8. public String getName():这显示了线程的名称。
  9. public void setName(String name):使用此方法可以改变线程的名称。

总结

线程是独立的,可以同时执行多个任务。我们已经了解了线程生命周期的各个阶段,创建线程的各种方法,以及如何启动线程。