http://hi.baidu.com/topsu/blog/item/c179c21876e180b24bedbc66.html
Runnable接口与Thread类的区别
如果让一个线程实现Runnable接口,那么当调用这个线程的对象开辟多个线程时,可以让这些线程调用同一个变量;若这个线程是由继承Thread类而来,则要通过内部类来实现上述功能,利用的就是内部类可任意访问外部变量这一特性。
例子程序:
public class ThreadTest {
public static void main(String[] args) {
MyThread mt = new MyThread();
new Thread(mt).start(); //通过实现Runnable的类的对象来开辟第一个线程
new Thread(mt).start(); //通过实现Runnable的类的对象来开辟第二个线程
new Thread(mt).start(); //通过实现Runnable的类的对象来开辟第三个线程
//由于这三个线程是通过同一个对象mt开辟的,所以run()里方法访问的是同一个index
}
}
class MyThread implements Runnable { //实现Runnable接口
int index = 0;
public void run() {
for(;index <= 200;)
System.out.println(Thread.currentThread().getName() + ":" + index++);
}
}
运行结果:
Thread-0:0
Thread-2:1
Thread-2:2
Thread-2:3
Thread-2:4
Thread-2:5
Thread-2:6
Thread-2:7
Thread-2:8
Thread-2:9
Thread-2:10
Thread-2:11
Thread-2:12
Thread-2:13
Thread-2:14
Thread-2:15
Thread-2:16
Thread-2:17
Thread-0:18
Thread-1:19
Thread-0:20
...
public class ThreadTest {
public static void main(String[] args) {
MyThread mt=new MyThread();
mt.getThread().start(); //通过返回内部类的对象来开辟第一个线程
mt.getThread().start(); //通过返回内部类的对象来开辟第二个线程
mt.getThread().start(); //通过返回内部类的对象来开辟第三个线程
//由于这三个线程是通过同一个匿名对象来开辟的,所以run()里方法访问的是同一个index
}
}
class MyThread {
int index = 0;
private class InnerClass extends Thread { //定义一个内部类,继承Thread
public void run() {
for(; index <= 200;)
System.out.println(getName() + ":" + index++);
}
}
Thread getThread() { //这个函数的作用是返回InnerClass的一个匿名对象
return new InnerClass();
}
}
这里有一个问题:如果内部类要访问一个外部变量或方法,那么这个变量或方法必须定义为final,但为什么这里的变量index不用定义为final就可以被内部类访问?
分享到:
相关推荐
"Thread 线程类实现 Runnable 接口" Thread 线程类是 Java 中 Thread 和 Runnable 接口的实现,它提供了线程的基本操作和管理。下面是对 Thread 类的详细介绍: 1. Runnable 接口 Runnable 接口是 Thread 类的...
Java提供了两种主要的方式实现多线程:一种是通过继承Thread类,另一种则是实现Runnable接口。 首先,通过继承Thread类创建线程是最直接的方法。Thread类是所有Java线程类的祖先,它提供了很多管理和控制线程状态的...
Java提供了两种主要的方式来创建线程:继承Thread类和实现Runnable接口。本篇文章将深入探讨通过实现Runnable接口来创建线程的方法,以及这种方式相比于直接继承Thread类的优势。 首先,我们来看Runnable接口。在...
通过实现Runnable接口,类仅提供一个线程执行的run方法,线程的创建和启动则需要通过Thread类来实现。使用Runnable接口有以下优点:首先,它允许类继续继承其他类,因为实现接口并不妨碍继承其他类;其次,它更符合...
在Java中,创建和管理线程有多种方式,其中两种常见的方法是继承java.lang.Thread类和实现java.lang.Runnable接口。Thread类是Java中用于处理线程的类之一,它使得线程对象化,而Runnable接口允许任何类实现多线程的...
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。
Java 中继承 Thread 类与实现 Runnable 接口的比较 在 Java 中,创建线程有两种方式:继承 Thread 类和实现 Runnable 接口。这些方式都可以用来创建线程,但它们之间有着一些关键的区别。 继承 Thread 类 继承 ...
在Java编程语言中,创建线程有两种主要方式:继承`Thread`类和实现`Runnable`接口。由于Java的单继承特性,当一个类需要继承其他类时,就不能再直接继承`Thread`,这时实现`Runnable`接口就成为创建线程的优选方案。...
这两种方法都可以实现阶乘计算的多线程化,主要区别在于继承`Thread`时,线程行为直接与类绑定,而实现`Runnable`接口时,线程行为是通过对象实例传递的。选择哪种方式取决于具体需求和设计考虑,例如是否需要复用类...
### 实现Runnable接口 #### 实现方式 实现`Runnable`接口的类只需要实现`run()`方法即可。这种方式不涉及类的继承,而是通过`Thread`类的构造函数传递`Runnable`对象来创建线程。 #### 优缺点 - **优点**:实现了...
Thread类本身就是Runnable接口的一个实现,二者主要的区别在于继承Thread类会使得类继承于Thread,而实现Runnable接口则提供了更大的灵活性,允许类继承自其他类。 继承Thread类创建线程的步骤通常如下: 1. 创建一...
在Java中,实现多线程的两种主要方式分别是:**通过继承`Thread`类** 和 **实现`Runnable`接口**。下面将详细介绍这两种方式,并提供相应的示例程序。 #### 一、通过继承`Thread`类实现多线程 在Java中,可以通过...
### 多线程的Runnable与Thread的区别 在Java中实现多线程有两种主要方式:一种是继承`Thread`类;另一种是实现`Runnable`接口。本文将深入探讨这两种方法的区别,帮助初学者更好地理解并选择适合场景的多线程实现...
1. 写两个线程,一个线程打印1-52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。 学习线程之间的通信协调关系。 2. 使用 runnable 接口实现按两... 使用继承Thread类方式和实现Runnable接口两种方式实现。
任何实现Runnable接口的类都可以被用来创建线程。 如何使用Runnable接口创建线程 使用Runnable接口创建线程的步骤如下: 1. 创建一个实现Runnable接口的类。 2. 在该类中重写run()方法,以便在线程中执行的操作。...
**一、实现Runnable接口** 1. 创建一个实现`Runnable`接口的类,如`RandomSquareRunnable`。在这个类中,我们需要重写`run()`方法,这是线程执行的主要逻辑。在这个`run()`方法里,我们可以编写绘制随机正方形的...
1. 什么是Runnable接口: 1.1 介绍Runnable接口 1.2 与Thread类的对比 2. 创建线程的方式: 2.1 继承Thread类 2.2 实现Runnable接口 3. 实现Runnable接口: 3.1 实现步骤 3.2 优点与用途 4. 启动线程: 4.1 使用...
- **创建Runnable接口的实现类**:定义一个类,实现`Runnable`接口,并重写`run()`方法,这里的`run()`方法包含线程执行的具体逻辑。 - **创建Runnable实现类的实例**:通过实例化这个实现类,为后续创建`Thread`...
实现Runnable接口需要创建一个Thread类的实例,并将Runnable对象传递给Thread的构造函数。然后,调用Thread的start()方法来启动线程。 下面是一个实现Runnable接口的示例代码: ```java public static void main...