一、线程
1.继承Thread
public static class Thread01 extends Thread{
@Override
public void run() {
System.out.println("当前线程:"+Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("运行结果:"+i);
}
}
//main方法中启动
Thread01 thread = new Thread01();
thread.start();//启动线程
2.实现Runnable接口
public static class Runnable01 implements Runnable{
@Override
public void run() {
System.out.println("当前线程:"+Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("运行结果:"+i);
}
}
//main方法启动
Runnable01 runnable01 = new Runnable01();
new Thread(runnable01).start();
3.实现Callable接口 + FutureTask (可以拿到返回结果,可以处理异常)
public static class Callable01 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println("当前线程:"+Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("运行结果:"+i);
return i;
}
}
//main方法启动
new Thread(futureTask).start();
//阻塞等待整个执行完成,返回结果
Integer integer = futureTask.get();
4.线程池(ExecutorService)
以后在业务代码中,以上三种开启线程方法均不使用,而是将【所有的多线程异步任务交给线程池来执行】
给线程池直接提交任务
/**
* 线程池七大参数
* corePoolSize 核心线程数,线程池创建好以后就准备就绪的线程数量,就等待接受异步任务去执行
* maximumPoolSize 线程池最大线程数量
* keepAliveTime 空闲线程存活时间
* unit 空间线程存活时间单位
* BlockingQueue 阻塞队列
* threadFactory 线程工厂
* handler 拒绝策略
*/
1、创建
1)、Executors
2)、new ThreadPoolExecutor
ThreadPoolExecutor executor = new ThreadPoolExecutor(5,
200,
10,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(10000),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);