第一种创建方式:
继承Thread,并且重写run方法。
package com.easytopit.thread;
public class ExtendsThread extends Thread {
@Override
public void run() {
for(int i = 1;i<=100;i++){
System.out.println("使用继承Thread的方法====="+i);
}
}
}
第二种创建方式(一般用的最多):
实现Runable接口,并且重写run方法。
package com.easytopit.thread;
public class RunableThread implements Runnable {
@Override
public void run() {
for(int i = 1;i<=100;i++){
System.out.println("使用实现Runnable方法来创建线程====="+i);
}
}
}
第三种创建方式:
实现Callable接口,并且重写call方法,通过FutureTask类来创建线程
package com.easytopit.thread;
import java.util.concurrent.Callable;
public class CallableThread implements Callable<Integer> {
@Override
public Integer call() throws Exception {
for(int i = 1;i<=100;i++){
System.out.println("实现Callable接口并且实现call方法====="+i);
}
return null;
}
}
测试类如下:
package com.easytopit.thread;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class ThreadTest {
public static void main(String[] args) {
//创建线程
Thread t1 = new ExtendsThread();
Runnable run = new RunableThread();
Thread t2 = new Thread(run);
Callable<Integer> call = new CallableThread();
FutureTask<Integer> ft = new FutureTask<>(call);
Thread t3 = new Thread(ft);
//只有start方法才是启动线程
t1.start();
t2.start();
t3.start();
}
}
继承Thread类的,代码编写简单,并且可以使用currentThread()方法来访问当前线程,但是继承该类之后不能继承其它的类。
实现Runable接口,有利于扩展性,实现了该接口之后,还可以实现其它接口或者继承其它的类。
实现Callable接口,编写相对于其它两种比较复杂,但是可以有返回值并且能抛出异常。