Java语言主要提供了两种实现线程的方式:继承Thread类创建线程类和实现Runnable接口创建线程类两种方式。
- 继承Thread类创建线程类
实现步骤:
- 定义类继承Thread类,并重写Thread类的run()方法,该run()方法的方法体就 代表了线程需要完成的任务。因此把run()方法称为线程执行体。
- 创建Thread子类的实例,即创建了线程对象。
- 调用线程对象的start()方法来启动该线程。
示例代码如下:
package com.gx.threaddemo;
public class ExtendsThreadDemo {
public static void main(String[] args) {
TestThread1 testThread1 = new TestThread1();
TestThread1 testThread2 = new TestThread1();
// 调用start方法方可启动线程
// 不能调用run()方法,run方法只是thread的一个普通方法,还是在主线程里执行。
testThread1.start();
testThread2.start();
System.out.println("‐‐‐‐‐‐‐‐‐‐‐‐‐‐");
}
}
/**
* 继承Thread类创建线程类 继承Thread类,重写run方法
*/
class TestThread1 extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("线程id:" + getId());
System.out.println("线程名称:" + getName());
for (int i = 0; i < 5; i++) {
System.out.println("线程id:" + getId() + "\t" + getName() + "\t" + i);
}
}
}
代码执行效果如图:
- Runnable接口创建线程类
实现步骤:
- 定义类实现Runnable接口,并重写Runnable接口的run()方法,该run()方法的 方法体就代表了线程需要完成的任务。
- 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
- 调用该Thread对象的start()方法来启动该线程。
示例代码如下:
package com.gx.threaddemo;
public class RunnableThreadDemo {
public static void main(String[] args) {
// 创建Runnable实现类的实例
TestThread2 testThread2 = new TestThread2();
// 创建Thread类,并把Runnable实现类的实例作为参数
Thread thread1 = new Thread(testThread2);
Thread thread2 = new Thread(testThread2);
// start() 方法启动线程
thread1.start();
thread2.start();
}
}
class TestThread2 implements Runnable {
@Override
public void run() {
// 实现Runnable接口的,无法直接使用getId(),getName()等方法
// 需要使用Thread.currentThread() 来获取到当前对象才行
System.out.println("线程Id:" + Thread.currentThread().getId());
System.out.println("线程名称:" + Thread.currentThread().getName());
for (int i = 0; i < 5; i++) {
System.out.println("线程Id:" + Thread.currentThread().getId() + "\t"
+ i);
}
}
}
代码执行效果如图: