2.Java中创建线程
Java中创建线程的方式
- 继承Thread,重写run方法;
- 实现Runnable,重写run方法,配合Thread;
- 实现Callable,重写call方法,配合FutureTask和Thread;(底层还是run)
- 线程池;
示例-继承Thread类
@Slf4j
public class BusinessThread extends Thread {@Overridepublic void run() {log.debug("do something");}
}
或者使用匿名内部类的方式:
public static void main(String[] args) {Thread thread = new Thread(){@Overridepublic void run() {log.debug("do something");}};thread.setName("子线程");thread.start();}
示例-使用Runnable配合Thread
- 这种方式相较于第一种的好处是,将【线程】和【任务(要执行的代码)】分开。
- 可以使用lambda简化,这里不在赘述。
public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic 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>() {@Overridepublic 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继承体系,更灵活