Java创建线程有几种方式
Java创建线程有5种方式
“Java创建线程有几种方式”这是一个很古老又很热门的面试话题,刚学习Java的能说出3种,认真复习的能说出4种,能够列出来的方式其实有5种,没错,5种!
①、继承Thread类,重写run方法
public static void main(String[] args) {
Run1 run1 = new Run1();
run1.run();
}
static class Run1 extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("no." + i);
}
}
}
②、实现Runnable接口,重写run方法
public static void main(String[] args) {
Run2 run2 = new Run2();
run2.run();
}
static class Run2 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("no." + i);
}
}
}
③、实现Callable,重写call方法,配合FuturTask
public static void main(String[] args) throws Exception {
MyCallable myCallable = new MyCallable();
FutureTask futureTask = new FutureTask<>(myCallable);
Thread thread = new Thread(futureTask);
thread.start();
Object count = futureTask.get();
System.out.println(count);
}
static class MyCallable implements Callable {
@Override
public Object call() throws Exception {
int count = 0;
for (int i = 0; i < 100; i++) {
count += i;
}
return count;
}
}
④、基于线程池ThreadPoolExecutor构建线程
⑤、lambda方式(也可以算一种)
Thread l = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println("no." + i);
}
});
l.start();
现在,忘掉上面的一切,以后就说归根结底只有1种!
在面试的时候,能说出有上面5种已经是比较出色了,不过在面试官眼里只能算背的不错,还看不出真正的能力。能够翻看源码,发现其共同点才能算得上优秀。
一步一步来
①、我们先看Thread类
其实Thread已经实现了Runnable接口,并“重写”了run方法,所以我们只不过是利用继承的方式,间接的重写了Runnable接口的run方法,下面是Runnable接口的源码。
②、我们看看FutureTask
FutureTask类实现了RunnableFuture接口,
RunnableFuture接口继承了Runnable接口。
FutureTask类里重写了run方法,用的就是我们自定义的MyCallable。(这块有点绕,建议仔细跟一下源码)
③、我们用线程池ThreadPoolExecutor类,每次构建的工作线程都是用的Worker类,可以看出,Worker类也是实现的Runnable接口。
综上,追其底层,线程创建都是基于实现Runnable接口,重写run方法实现的。