Java线程是多任务编程的核心,它允许程序同时执行多个任务。在Java中,线程的创建和运行可以通过两种主要方式实现:继承`Thread`类或者实现`Runnable`接口。
我们来看如何通过继承`Thread`类来创建线程。创建一个线程的子类,你需要重写`run()`方法,这个方法包含了线程运行时要执行的代码。例如:
```java
public class MyThread extends Thread {
public void run(){
System.out.println("MyThread running");
}
}
```
然后你可以创建`MyThread`的实例并调用`start()`方法来启动线程:
```java
MyThread myThread = new MyThread();
myThread.start();
```
`start()`方法会调用`run()`方法,但并不会阻塞主线程的执行,而是让`run()`方法在新的线程上下文中异步执行。
另一种方式是实现`Runnable`接口。创建一个类实现`Runnable`,并重写`run()`方法:
```java
public class MyRunnable implements Runnable {
public void run(){
System.out.println("MyRunnable running");
}
}
```
然后将`Runnable`实例传递给`Thread`的构造函数:
```java
Thread thread = new Thread(new MyRunnable());
thread.start();
```
这种方式更加灵活,因为Java不支持多重继承,但可以实现多个接口。此外,`Runnable`接口适用于线程池,如`ExecutorService`,可以更有效地管理线程资源,避免创建过多线程导致的资源消耗。
在某些情况下,你可能希望在线程创建时不创建新的类,而是使用匿名内部类或lambda表达式,这样可以简化代码。例如,使用匿名内部类:
```java
Thread thread = new Thread(new Runnable() {
public void run() {
System.out.println("Thread Running");
}
});
thread.start();
```
或者使用Java 8及更高版本的lambda表达式:
```java
Thread thread = new Thread(() -> System.out.println("Runnable running"));
thread.start();
```
关于创建子类还是实现`Runnable`接口的选择,通常取决于具体需求。如果你的类需要继承其他类,那么实现`Runnable`接口会是更好的选择,因为Java不支持多重继承。而如果类只用于创建线程,继承`Thread`类则更为直接。然而,考虑到线程池和资源管理,实现`Runnable`接口通常被认为是更推荐的做法。
理解Java中的线程创建和运行机制对于编写高效并发程序至关重要。正确使用线程可以提升程序性能,但也需要注意线程安全问题,防止数据竞争和死锁的发生。在实际开发中,还要结合同步机制(如`synchronized`关键字,`wait()`, `notify()`, `notifyAll()`方法)和并发工具类(如`Semaphore`, `CyclicBarrier`, `CountDownLatch`等)来确保线程间的协同工作。