方法一 使用Thread
public static void main(String[] args) {
Thread t1 = new Thread("t1") {
//方法内部实现了要执行的任务
@Override
public void run() {
log.info("hello world");
}
};
t1.start();
}
执行结果:
[t1] INFO Test01 - hello world
方法二 使用Runnable配合Thread
把【线程】和【任务】(要执行的代码)分开
- Thread 代表线程
- Runnable可运行的任务(线程要执行的代码)
public static void main(String[] args) {
//创建任务对象
Runnable task1 = new Runnable() {
public void run() {
log.info("hello world");
}
};
//参数1是任务对象;参数2是线程名字
Thread t1 = new Thread(task1, "t1");
t1.start();
}
执行结果: [t1] INFO Test02 - hello world
小结
- 方法1是把线程和任务合并在了一起,方法2是把线程和任务分开了
- 用Rnnable更容易与线程等高级API配合
- 用Rnnable让任务类脱离了Thread继承体系,更灵活
方法三 FutrureTask配合Thread
FutureTask能够接收Callable类型参数,用来处理有返回的结果的情况
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建任务对象
FutureTask<Integer> task1 = new FutureTask<>(() -> {
log.debug("hello world");
return 100;
});
//参数1是任务对象;参数2是线程的名字
new Thread(task1,"t1").start();
//主线程阻塞,同步等待task执行完毕的结果
Integer result = task1.get();
log.debug("结果是:{}",result);
}
执行结果:
- [t1] INFO Test03 - hello world
- [main] INFO Test03 - 结果是:100