在Java中创建和管理线程主要有两种方式:通过实现Runnable接口或继承Thread类。下面我将详细解释这两种方法,并提供一些示例代码。
方法一:实现Runnable接口
实现Runnable接口是创建线程的首选方式,因为它允许我们避免单继承的局限性。要实现Runnable接口,我们需要重写run方法,该方法定义了线程要执行的任务。
java复制代码
|
public class MyRunnable implements Runnable { |
|
@Override |
|
public void run() { |
|
// 线程要执行的代码 |
|
System.out.println("线程正在运行: " + Thread.currentThread().getName()); |
|
} |
|
} |
然后,我们可以创建一个Thread对象,将Runnable实例作为参数传递给Thread的构造函数,并调用start方法来启动线程。
java复制代码
|
public class ThreadDemo { |
|
public static void main(String[] args) { |
|
// 创建Runnable实例 |
|
MyRunnable myRunnable = new MyRunnable(); |
|
|
|
// 创建Thread对象,并将Runnable实例传递给它 |
|
Thread thread = new Thread(myRunnable); |
|
|
|
// 启动线程 |
|
thread.start(); |
|
|
|
// 主线程继续执行 |
|
System.out.println("主线程执行完毕"); |
|
} |
|
} |
方法二:继承Thread类
另一种创建线程的方法是直接继承Thread类并重写run方法。
java复制代码
|
public class MyThread extends Thread { |
|
@Override |
|
public void run() { |
|
// 线程要执行的代码 |
|
System.out.println("线程正在运行: " + Thread.currentThread().getName()); |
|
} |
|
} |
然后,我们可以直接创建MyThread的实例,并调用其start方法来启动线程。
java复制代码
|
public class ThreadDemo { |
|
public static void main(String[] args) { |
|
// 创建Thread子类实例 |
|
MyThread myThread = new MyThread(); |
|
|
|
// 启动线程 |
|
myThread.start(); |
|
|
|
// 主线程继续执行 |
|
System.out.println("主线程执行完毕"); |
|
} |
|
} |
线程管理
在Java中,线程的管理包括线程的启动、等待线程结束、线程的强制停止等。
· 启动线程:通过调用线程的start()方法启动线程。
· 等待线程结束:可以调用线程的join()方法,让当前线程等待该线程结束后再继续执行。
· 强制停止线程:虽然不推荐直接停止线程(因为它可能导致不可预测的行为),但如果你确实需要这样做,可以调用stop()方法。不过,从Java 1.5开始,stop()方法已被废弃,建议使用更安全的interrupt()方法,它会在目标线程中设置一个中断标志,线程可以检查这个标志来决定是否应该停止执行。
java复制代码
|
// 强制停止线程(不推荐) |
|
thread.stop(); |
|
|
|
// 更安全的方式是使用interrupt() |
|
thread.interrupt(); |
在run方法内部,线程可以通过检查Thread.interrupted()或Thread.isInterrupted()来响应中断。
线程状态
Java中的线程有五种状态:新建(New)、可运行(Runnable)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)。线程的状态可以通过Thread类的getState()方法获取。
线程同步与通信
当多个线程需要访问共享资源时,需要使用同步机制来确保线程安全。Java提供了synchronized关键字和wait()、notify()、notifyAll()等方法来实现线程同步和通信。
线程池
对于大量并发的线程,使用线程池(ExecutorService)是一个更好的选择。线程池可以复用线程,减少创建和销毁线程的开销。Java中的Executors类提供了创建线程池的静态方法。
示例:使用线程池
java复制代码
|
import java.util.concurrent.ExecutorService; |
|
import java.util.concurrent.Executors; |
|
|
|
public class ThreadPoolDemo { |
|
public static void main(String[] args) { |
|
// 创建一个固定大小的线程池 |
|
ExecutorService executor = Executors.newFixedThreadPool(5); |
|
|
|
for (int i = 0; i < 10; i++) { |
|
Runnable worker = new MyRunnable(); |
|
executor.execute(worker); // 提交任务给线程池执行 |
|
} |
|
|
|
executor.shutdown(); // 关闭线程池 |
|
while (!executor.isTerminated()) { |
|
} |
|
|
|
System.out.println("所有任务执行完毕"); |
|
} |
|
} |