采用继承Thread类方式 优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread 0方法,直接使用this,即可获得当前线程 详解直接使用this
时间: 2024-09-21 14:01:13 浏览: 36
采用继承`Thread`类创建线程的方式,其主要优点包括:
1. **简洁性**:由于你直接继承自`Thread`类,所以可以直接在类中定义run()方法,这是线程的主要执行体。这使得代码更简洁,不需要显式地创建`Thread`实例然后启动。
```java
public class MyThread extends Thread {
public void run() {
// 这里就是线程的主体任务,可以直接使用 this 来获取当前线程实例
System.out.println(Thread.currentThread().getName()); // 直接打印当前线程名,无需额外获取
}
}
```
2. **方便访问当前线程**:正如你所提到的,继承这种方式下,可以直接使用`this`关键字,而无需调用`Thread.currentThread()`方法来获取当前线程实例。这是因为`this`实际上指向的是当前正在执行的对象,即新创建的`MyThread`对象。
3. **易于理解**:对于简单的单线程任务,继承`Thread`类的模式更直观,因为它清楚地显示了线程的概念。
然而,这种方法也有局限性,比如每个类只能有一个线程(除非使用`start()`方法再新建一个线程实例),并且如果需要定制线程的行为或利用多线程特性,如同步控制,可能就需要通过实现`Runnable`接口或混合使用两者来更好地设计。此外,如果继承`Thread`,那么run方法内不能直接修改类的状态,因为可能会导致非线程安全的问题。
相关问题
方便访问当前线程:正如你所提到的,继承这种方式下,可以直接使用this关键字,而无需调用Thread.currentThread()方法来获取当前线程实例。这是因为this实际上指向的是当前正在执行的对象,即新创建的MyThread对象。 举例说明
举个例子,假设我们有这样一个继承自`Thread`的类`MyThread`,它有一个内部变量用于记录线程状态:
```java
public class MyThread extends Thread {
private String threadStatus;
public MyThread(String status) {
this.threadStatus = status;
}
@Override
public void run() {
// 在这里可以直接使用 this 获取当前线程实例,并操作threadStatus
threadStatus = "Running"; // 更新状态为"Running"
System.out.println("Current thread status: " + this.threadStatus); // 输出当前线程状态
}
}
// 使用示例
public static void main(String[] args) {
MyThread myThread = new MyThread("Initial");
myThread.start(); // 启动线程
// 此时虽然myThread还没有运行,但如果我们直接访问this.threadStatus,会得到错误,因为尚未设置
// System.out.println(myThread.threadStatus); // 输出:Initial (未初始化)
// 线程开始执行后,可以直接使用 this 访问并更新状态
}
```
在这个例子中,当我们调用`myThread.threadStatus`时,在主线程中,`this`确实指代的是`MyThread`实例,所以在`run()`方法中可以直接操作`threadStatus`,而无需每次都获取当前线程。但在主线程中直接访问可能会出错,因为`threadStatus`是在`run()`方法内部初始化的,只有当线程真正执行时才会生效。
下列代码利用继承Thread类实现线程的创建,运行结果如下图所示。根据运行结果利用实现Runnable接口的任务类、匿名类和Lambda表达式改写下面的代码实现相同的功能。 public class ThreadDemo extends Thread { public void run() { for (int i = 0; i < 100; i++) { // 继承Thread类时,直接使用this即可获取当前线程对象 // 调用getName()方法返回当前线程的名字 System.out.println(this.getName() + " : " + i); } } public static void main(String[] args)throws Exception { ThreadDemo td = new ThreadDemo(); td.start(); td.join(); // 主线程任务 for (int i = 1000; i < 1100; i++) { // 使用Thread.currentThread().getName()获取主线程名字 System.out.println(Thread.currentThread().getName() + " : " + i); } } }
使用实现Runnable接口的任务类改写代码如下:
```
public class RunnableDemo implements Runnable {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " : " + i);
}
}
public static void main(String[] args) throws Exception {
RunnableDemo rd = new RunnableDemo();
Thread t = new Thread(rd);
t.start();
t.join();
for (int i = 1000; i < 1100; i++) {
System.out.println(Thread.currentThread().getName() + " : " + i);
}
}
}
```
使用匿名类改写代码如下:
```
public class AnonymousDemo {
public static void main(String[] args) throws Exception {
Thread t = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " : " + i);
}
}
});
t.start();
t.join();
for (int i = 1000; i < 1100; i++) {
System.out.println(Thread.currentThread().getName() + " : " + i);
}
}
}
```
使用Lambda表达式改写代码如下:
```
public class LambdaDemo {
public static void main(String[] args) throws Exception {
Thread t = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " : " + i);
}
});
t.start();
t.join();
for (int i = 1000; i < 1100; i++) {
System.out.println(Thread.currentThread().getName() + " : " + i);
}
}
}
```
阅读全文