Java中创建线程的方式
- 继承Thread,重写run方法;
- 实现Runnable,重写run方法,配合Thread;
- 实现Callable,重写call方法,配合FutureTask和Thread;(底层还是run)
- 线程池;
示例-继承Thread类
@Slf4j
public class BusinessThread extends Thread {
@Override
public void run() {
log.debug("do something");
}
}
或者使用匿名内部类的方式:
public static void main(String[] args) {
Thread thread = new Thread(){
@Override
public void run() {
log.debug("do something");
}
};
thread.setName("子线程");
thread.start();
}
示例-使用Runnable配合Thread
- 这种方式相较于第一种的好处是,将【线程】和【任务(要执行的代码)】分开。
- 可以使用lambda简化,这里不在赘述。
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
log.debug("do something");
}
};
Thread thread = new Thread(runnable);
thread.setName("子线程");
thread.start();
}
示例-使用Callable配合FutureTask和Thread
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
log.debug("do something");
Thread.sleep(1000);
return 200;
}
});
// FutureTask继承了Runnable,可以作为Thread的入参
Thread thread = new Thread(futureTask);
thread.setName("子线程");
thread.start();
// get是阻塞方法
Integer result = futureTask.get();
log.debug("返回结果{}", result);
}
总结
- 方法一是把线程和任务合并在了一起,方法二将它们分开了。使用Runnable更容易和线程池等高级API配合,Runnable让任务类脱离了Thread继承体系,更灵活
Java中创建线程的方法详解

被折叠的 条评论
为什么被折叠?



