1. 继承Thread类,重写run方法,new出对象.start()即可。
public class Thread3 extends Thread{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(this.getName()+":"+i+"这是线程");
}
}
}
2. 实现Runnable接口,实现run方法,把实现类的对象obj传给new Thread(obj),再用Thread 类的对象.start()方法来启动线程。
public void run() {
for (int i = 0; i < 20; i++) {
String name = Thread.currentThread().getName();
System.out.println(name+":"+i);
}
}
public static void main(String[] args) {
Thread2 thread2 = new Thread2();
Thread thread = new Thread(thread2);
thread.start();
注意:不能直接调用run方法,启动线程必须使用start()方法,直接调用run方法是相当于直接调用普通方法
直接继承Thread的可以用(Thread.currentThread()获取当前运行的线程)或this.getName()/setName()方法来得到或者赋予一个线程名字。
实现runnable接口的用Thread.currentThread()获取当前运行的线程或Thread.currentThread().getName()/setName()方法来得到或者赋予一个线程名字。这里没有this。
区别:实现Runnable接口有何优点?
1. 解决了单继承的问题,一个类只能继承一个类,类继承了Thread类之后就不能再继承其他类了。实现Runnable接口,还可以继承其他类,实现其他接口。
2. 增强了程序的扩展性,降低了程序的耦合性(解耦)
实现Runnable接口的方式,把设置线程任务和开启线程进行了分离(解耦)。实现类中,重写了run方法,用来设置线程任务,创建Thread类的对象,调用start方法,用来开启新线程。
3.建议以后使用中用实现Runnable接口的方式