1.继承Thread类,重写run()方法
(1)继承Thread类,重写run()方法 (2)创建子类对象 (3)调用线程对象的start()方法,启动线程
public class Demo extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(getName() + ":" + "i=" + i);
}
}
public static void main(String[] args) {
Demo d = new Demo();
d.setName("线程1");
d.start();
}
}
getName():可以获得当前线程的名称。 setName():设置线程名。
2.实现Runable接口
(1)实现接口中的run()方法,将线程的任务代码封装到run方法中; (2)通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造方法的参数进行传递; (3)调用线程对象的start()方法开启线程
public class Demo implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("i=" + i);
}
}
public static void main(String[] args) {
Demo d = new Demo();
Thread tr = new Thread(d);//将Runnable接口的子类对象作为Thread类的构造方法的参数进行传递
tr.start();
}
}
3.实现Runnable接口创建线程的好处
- 将线程的任务从线程的子类中分离出来,进行了单独的封装。按照面向对象的思想将任务封装成对象;
- 避免了java单继承的局限性;
所以这种方式比较常用