自定义线程的方式一
步骤:
- 自定义一个类继承Thread类
- 重写Thread类的run方法,把自定义线程的任务代码写在run方法中
- 创建Thread类的子类对象,并且调用start方法开启线程
疑问:重写run方法的目的是什么?
每个线程都有自己的任务代码,jvm创建的主线程的任务代码就是main方法中的所有代码,而自定义线程的任务代码就写在run方法中,自定义线程负责了run方法中的代码。
注意:一个线程一旦开启,那么线程就会执行run方法中的代码,run方法千万不能直接调用,直接调用run方法就相当与调用了一个普通的方法而并没有开启新的线程。
public class Demo1 extends Thread {
@Override // 把自定义线程的任务代码写在run方法中。
public void run() {
for(int i = 0;i < 100;i ++) {
System.out.println("自定义线程:" + i);
}
}
public static void main(String[] args) {
Demo1 d = new Demo1(); // 创建自定义的线程对象
d.start(); // 调用start方法启动线程
for(int i = 0;i < 100;i ++) {
System.out.println("主线程:" + i);
}
}
}
自定义线程的方式二
步骤:
- 自定义一个类实现Runnable接口
- 实现Runnable接口的run方法,把自定义线程的任务代码写在run方法上
- 创建Runnable实现类的对象
- 创建Thread类的对象,并且把Runnable实现类的对象作为实参传递
- 调用Thread对象的start方法开启一个线程
问题1:请问Runnable实现类的对象是线程对象吗?
Runnable实现类的对象不是线程对象,只不过是实现Runnable接口的类的对象而已。只有Thread类或者Thread类的子类才是线程对象。
问题2:为什么要把Runnable实现类的对象作为实参传递给Thread对象呢?作用是什么?
作用就是把Runnable实现类的对象的run方法作为线程的任务代码去执行。
public class Demo2 implements Runnable { // 1、自定义一个类实现Runnable接口
/**
* 2、实现Runnable接口的run方法,把自定义线程的任务代码写在run方法上
*/
@Override
public void run() {
System.out.println("this:" + this); // (this表示的是Runnable接口的实现类对象)
System.out.println("当前线程:" + Thread.currentThread().getName()); // 狗娃
for(int i = 0;i < 100;i ++){
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
public static void main(String[] args) {
// 3、创建Runnable实现类的对象
Demo2 d = new Demo2();
// 4、创建Thread类的对象,并且把Runnable实现类的对象作为实参传递
Thread thread = new Thread(d, "狗娃"); // 创建了一个线程对象,并将其名字赋初值。
// 5、调用Thread对象的start方法开启一个线程
thread.start();
for(int i = 0;i < 100;i ++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}