第一种方法(继承Thread)
public class ThreadTest {
public static void main(String[] args) {//运行main方法的线程是主线程
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName());
System.out.println("main的主线程"+i);
}
new Thread1("自定义线程").run();
}
}
class Thread1 extends Thread{
public Thread1(String name) {
super(name);
}
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println(Thread1.currentThread().getName());
System.out.println(this.getName()+i);
}
}
}
第二种方法(实现Runnable)
步骤
- 定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体
- 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象
- 调用线程对象的start()方法来启动线程
public class Test2 {
public static void main(String[] args) {
ThreadTest2 threadTest2 = new ThreadTest2();
new Thread(threadTest2).start();
}
}
class ThreadTest2 implements Runnable{
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+i);
}
}
}
两种方法之间的区别
实现Runnable方法比较容易实现资源共享
总结:
实现Runnable接口比继承Thread类所具有的优势:
- 适合多个相同的程序代码的线程去共享同一个资源
- 可以避免java中的单继承的局限性
- 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立
- 线程池只能放入实现Runnable或者Callable类线程,不能直接放入继承Thread的类