欢迎访问宙启技术站
智能推送

Java中的线程管理函数示例:创建、启动、暂停、恢复、停止等

发布时间:2023-05-31 02:54:05

Java中线程是一种轻量级进程,可以让程序执行多个任务同时进行,提高程序的运行效率。在Java中线程的管理主要包括创建、启动、暂停、恢复和停止等功能。

一、创建线程

Java中线程的创建可以通过继承Thread类和实现Runnable接口两种方式来实现。

1. 继承Thread类

通过继承Thread类来创建线程,首先需要创建一个继承自Thread类的子类,然后重写run()方法,该方法是线程运行时执行的代码。例如:

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

在Main中创建一个MyThread对象,并调用start()方法来启动线程。

MyThread mt = new MyThread();
mt.start();

2. 实现Runnable接口

通过实现Runnable接口来创建线程,定义一个实现了Runnable接口的类,该类需要重写run()方法。然后在Main方法中创建该类的对象,并传入Thread类的构造函数中。例如:

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

MyRunnable mr = new MyRunnable();
Thread t = new Thread(mr);
t.start();

二、启动和停止线程

在Java中线程的启动主要是通过start()方法来实现的,调用start()方法后线程会进入就绪状态然后等待CPU调度,CPU选择合适的时机来运行线程。一旦一个线程启动后,它会一直运行直到线程结束,调用停止线程的方法或者发生异常等情况。

1. 停止线程

Java中有两种方式来停止线程,一种是设置一个布尔变量用来控制线程的运行,一旦该变量为false,线程就会停止运行,另一种是通过调用线程的stop()方法来停止线程。

使用布尔变量来停止线程的实现方法如下:

class MyThread extends Thread {
   private boolean isStop = false;
   
   public void run() {
      while(!isStop){
         System.out.println("MyThread is running.");
      }
   }
   
   public void stopThread(){
      isStop = true;
   }
}

MyThread mt = new MyThread();
mt.start();
// 停止线程
mt.stopThread();

不推荐使用stop()方法来停止线程,因为该方法会抛出ThreadDeath异常,使得线程停止的不可控,可以使用interrupt()方法来中断线程。interrupt()方法会将线程的中断标志位设置为true,然后线程在适当的时候退出执行。

class MyThread extends Thread {
   public void run() {
      while(!isInterrupted()){
         System.out.println("MyThread is running.");
      }
   }
   
   public void stopThread(){
      interrupt();
   }
}

MyThread mt = new MyThread();
mt.start();
// 停止线程
mt.stopThread();

2. 暂停和恢复线程

Java中暂停和恢复线程的方法需要使用Thread类的suspend()和resume()方法,但是不建议使用这两个方法,因为这种方式容易引起死锁和其它问题。

三、线程同步

线程同步是指多个线程访问同一共享资源时需要互相等待的情况,为了避免线程访问同一共享资源导致数据出错,需要对共享资源进行同步。Java中提供了synchronized关键字来对共享资源进行同步。

1. 同步块

同步块可以锁住一个代码块,使得多个线程不能同时执行同步块中的代码。

public synchronized void method(){
   // 代码
}

上述代码中,方法中的代码块就是同步块,它使用synchronized关键字来锁定方法,使得只有一个线程可以访问该方法中的代码。

2. 同步方法

同步方法是在方法声明中使用synchronized关键字来修饰,表示该方法是同步方法,只有一个线程可以访问该方法。

public synchronized void method(){
   // 代码
}

上述代码中,method()方法就是同步方法,只有一个线程可以访问该方法。

四、线程通信

线程通信指的是多个线程之间如何协作完成任务,在Java中可以使用wait()、notify()和notifyAll()方法来实现线程之间的通信。

1. wait()和notify()方法

wait()方法的作用是让当前线程进入等待状态,直到其它线程调用notify()方法或者notifyAll()方法唤醒该线程。

public synchronized void method() {
   while (conditionHold()) {
      try {
         wait();
      } catch (InterruptedException e) {
         // 处理等待中断异常
      }
   }
   // 线程继续执行
}

上述代码中,当条件hold时,线程将进入等待状态,直到其它线程调用notify()方法或者notifyAll()方法唤醒该线程。

notify()方法的作用是唤醒正在等待状态的一个线程,如果有多个线程在等待,那么只会唤醒一个线程。

public synchronized void method() {
   notify();
}

2. notifyAll()方法

notifyAll()方法的作用是唤醒所有正在等待状态的线程,可以解决多线程之间的互相等待问题。

public synchronized void method() {
   notifyAll();
}

总结:

线程的创建可以通过继承Thread类和实现Runnable接口两种方式来实现。

线程的启动可以通过start()方法来实现。

线程的停止可以通过设置一个布尔变量用来控制线程的运行或者通过调用interrupt()方法来停止线程。

线程的同步可以通过synchronized关键字来实现。

线程的通信可以通过wait()、notify()和notifyAll()方法来实现。