目录
1)继承Thread类创建线程
public class ThreadDemo01 extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "<run>");
}
public static void main(String[] args) {
// 创建一个线程
ThreadDemo01 threadDemo01 = new ThreadDemo01();
// 启动线程是start方法而不是run方法
threadDemo01.start();
}
}
2)实现Runnable接口创建线程
public class ThreadDemo02 implements Runnable {
public void run() {
System.out.println(Thread.currentThread().getName() + ",我是子线程");
}
public static void main(String[] args) {
new Thread(new ThreadDemo02()).start();
}
}
3)使用匿名内部类的形式创建线程
// 使用匿名内部类创建线程
new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + ",>我是子线程<");
}
}).start();
4)使用lambda表达式创建线程
使用jdk8的新特性lambda 创建线程
// lambda表达式创建线程
new Thread(()->{
System.out.println(Thread.currentThread().getName() + ",>我是子线程<");
}).start();
5)使用Callable和Future创建线程
Callable和Future 线程可以获取到返回结果 底层基于LockSupport
从Java 5开始,Java提供了Callable接口,该接口是Runnable接口的增强版,Callable接口提供了一个call()方法,可以看作是线程的执行体,但call()方法比run()方法更强大。
call()方法可以有返回值。
call()方法可以声明抛出异常。
public class ThreadCallable implements Callable<Integer> { |
6)使用线程池例如用Executor框架
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ">我是子线程<");
}
});
7)spring @Async异步注解 结合线程池
//@Async 底层基于aop+自定义注解实现
@Component
@Slf4j
public class OrderManage {
@Async
public void asyncLog() {
try {
Thread.sleep(3000);
log.info("<2>");
} catch (Exception e) {
}
}
}
/**
* http://127.0.0.1:8086/addOrder
*
* @return
*/
@RequestMapping("/addOrder")
public String addOrder() {
log.info("<1>");
orderManage.asyncLog();
log.info("<3>");
return "3";
}