在 Java 编程中,Thread
类是实现多线程的核心类之一。下面将对Thread
类在创建线程、线程中断、线程等待、线程休眠和获取线程实例等方面的基本用法进行总结。
一、线程创建
- 继承 Thread 类
- 定义一个类继承自
Thread
类。 - 重写
run
方法,run
方法中包含了该线程要执行的任务。 - 创建该类的实例,然后调用
start
方法来启动线程。 - 示例代码:
- 定义一个类继承自
class MyThread extends Thread {@Overridepublic void run() {// 线程要执行的任务System.out.println("MyThread is running");}
}
public class Main {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start();}
}
- 实现 Runnable 接口
- 定义一个类实现
Runnable
接口,实现run
方法。 - 创建
Thread
类的实例,将实现Runnable
接口的类的实例作为参数传入Thread
构造函数。 - 调用
Thread
实例的start
方法启动线程。 - 示例代码:
- 定义一个类实现
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("MyRunnable is running");}
}
public class Main {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start();}
}
二、线程中断
- 使用 interrupt 方法
- 一个线程可以通过调用另一个线程的
interrupt
方法来请求中断该线程。 - 被中断的线程需要通过检查自身的中断状态来做出相应的处理。通常可以在
run
方法中使用isInterrupted
方法来检查是否被中断。 - 示例代码:
- 一个线程可以通过调用另一个线程的
class InterruptibleThread extends Thread {@Overridepublic void run() {while (!isInterrupted()) {// 线程执行的任务System.out.println("Thread is running");}System.out.println("Thread is interrupted");}
}
public class Main {public static void main(String[] args) {InterruptibleThread thread = new InterruptibleThread();thread.start();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}thread.interrupt();}
}
- 响应中断的两种方式
- 立即响应:当检测到
isInterrupted
为true
时,立即停止当前线程的执行,如上述示例。 - 在合适的时机响应:例如,当线程正在执行一个阻塞操作(如
sleep
、wait
等)时被中断,会抛出InterruptedException
异常。在捕获该异常后,可以在catch
块中处理中断相关的操作,如清理资源后退出线程。
- 立即响应:当检测到
三、线程等待
- 使用 join 方法
- 当一个线程需要等待另一个线程执行完毕后再继续执行时,可以使用
join
方法。 - 调用线程实例的
join
方法的线程会被阻塞,直到被调用join
方法的线程执行结束。 - 示例代码:
- 当一个线程需要等待另一个线程执行完毕后再继续执行时,可以使用
class ThreadA extends Thread {@Overridepublic void run() {System.out.println("ThreadA is running");}
}
public class Main {public static void main(String[] args) throws InterruptedException {ThreadA threadA = new ThreadA();threadA.start();threadA.join();System.out.println("Main thread continues after ThreadA finishes");}
}
四、线程休眠
- 使用 sleep 方法
- 可以通过调用
Thread
类的静态方法sleep
来使当前线程休眠指定的时间(以毫秒为单位)。 - 在休眠期间,线程会释放 CPU 资源,但不会释放锁(如果持有锁的话)。
- 示例代码:
- 可以通过调用
public class Main {public static void main(String[] args) {Thread thread = new Thread(() -> {try {System.out.println("Thread is going to sleep");Thread.sleep(2000);System.out.println("Thread wakes up");} catch (InterruptedException e) {e.printStackTrace();}});thread.start();}
}
五、获取线程实例
- 在类内部获取当前线程实例
- 在
Thread
类的子类中,可以通过this
关键字获取当前线程实例。 - 在实现
Runnable
接口的类中,可以通过Thread.currentThread()
方法获取当前执行的线程实例。 - 示例代码:
- 对于继承
Thread
类:
- 在
class MyThread extends Thread {@Overridepublic void run() {System.out.println("Current thread: " + this);}
}
- 对于实现
Runnable
接口:
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Current thread: " + Thread.currentThread());}
}
- 在外部获取线程实例
- 当创建并启动了线程后,可以直接通过线程对象引用来获取线程实例。例如在上面提到的线程创建示例中,创建的
MyThread
或thread
(通过Runnable
创建的Thread
对象)本身就是线程实例,可以对其进行操作。
- 当创建并启动了线程后,可以直接通过线程对象引用来获取线程实例。例如在上面提到的线程创建示例中,创建的
通过对Thread
类在这些方面的用法掌握,可以更好地在 Java 程序中实现多线程编程,充分利用系统资源,提高程序的执行效率和响应能力。