一、三种方式:
1、继承Thread类
2、实现Runnable接口
public class HowToCreateThread {
static class Thread1 extends Thread {
@Override
public void run() {
System.out.println("Hello Thread.");
}
}
static class Thread2 implements Runnable {
@Override
public void run() {
System.out.println("Hello Thread2");
}
}
public static void main(String[] args) {
new Thread1().start();
new Thread(new Thread2()).start();
new Thread(() -> { //lamda表达式的方式
System.out.println("Test");
}).start();
}
}
3、FutureTask的方式
public class CallableTest implements Callable<Integer> {
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i < 100000; i++) {
sum += i;
}
return sum;
}
public static void main(String[] args) {
CallableTest td = new CallableTest();
FutureTask<Integer> ft = new FutureTask<>(td);
new Thread(ft).start();
try {
Integer sum = ft.get();
System.out.println(sum);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
当然有的人说第三种方式是lamda表达式的方式,这个自己清楚就行了。没必要执泥于此。
二、区别:
1、继承Thread的方式,好处是方便传参,可以在子类里添加成员变量,通过set方法设置参数或者通过构造函数进行传递,不好的地方是由于JAVA没有多继承,就不能继承其他类了。
2、实现Runnable的方式是只能使用主线程里面被声明为final的变量,但是可以实现多个接口。
3、FutureTask的方式可以有返回值,前两个没有。