多线程学习之创建线程的方法
一、通过runnable接口创建线程
1.重写runnable的run方法
2.使用runnable对象构造Thread对象
3.启动线程
二、继承Thread类创建线程
1.继承Thread类,重新run方法
2.构造这个Thread子类
3.调用start方法启动线程
三、使用Callable和FutureTask创建线程
1.实现Callable接口,重写call方法
2.传入Callable对象,构造FutureTask(Runnable的子类)对象
3.传入FutureTask对象构造Thread对象,启动线程
四、将Runnable或Callable放到线程池ExecutorsService中执行
1.实现Callable/Runnable接口,重写call/run方法
2.构建ExecutorService线程池对象,调用线程池execute或者submit方法执行线程
3.对于submit方式提交,使用Future来获取线程执行结果。
五、CountDownLatch控制多个线程执行顺序
使用CountDownLatch线程池,可以令主线程阻塞。当CountDownLatch的线程任务全部完成后,主线程才能继续往下执行。
private void cxStockScan(String reportDate){
final Date pdate = simpleDateFormat.parse(reportDate);
ExecutorService executorService = Executors.newFixedThreadPool(3);
final CountDownLatch latch = new CountDownLatch(3);
executorService.execute(new Runnable() {
@Override
public void run() {
try {
// 执行第一个任务
} catch (Exception e){
//打印错误日志
} finally {
latch.countDown();
}
}
});
executorService.execute(new Runnable() {
@Override
public void run() {
try {
//执行第二个任务
} catch (Exception e){
//打印错误日志
} finally {
latch.countDown();
}
}
});
executorService.execute(new Runnable() {
@Override
public void run() {
try {
//执行第三个任务
} catch (Exception e){
//打印错误日志
} finally {
latch.countDown();
}
}
});
// 等待60分钟
latch.await(60, TimeUnit.MINUTES);
// 关闭线程池
executorService.shutdown();
}