多线程,顾名思义就是多个线程来做事,速度加快许多。
多线程有哪些应用
需要区分下情况。
多线程批量执行相互独立的程序
这种最简单。 多条记录之间无关系。 for循环+线程池即可。
多个线程执行共享数据
例如抢票。
就复杂了一些,需要考虑到事务和锁。 配合信号量和回环栅栏来实现。
多线程异常处理
首先要知道,catch是无法获取到主线程的异常的。
需要实现UncaughtExceptionHandler接口。代码如下:
class ExcedptionHandler implements Thread.UncaughtExceptionHandler{
@Override
public void uncaughtException(Thread t,Throwable e){
System.out.println("运行时异常;"+e.getMessage());
}
public static void main(String[] args) {
Thread t=new Thread(new Task());
t.setUncaughtExceptionHandler(new ExcedptionHandler());
t.start();
}
}
当然也可以在run方法中设置异常处理:
这种适用于ExecutorService.execute执行的方法
class Task implements Runnable{
@Override
public void run(){
/**
* 此时的UnccaughtExceptionHandler需要在此设置
*/
Thread.currentThread().setUncaughtExceptionHandler(new ExcedptionHandler());
System.out.println(0/0);
}
}
submit提交的线程异常会被get()法抛出:
public static void main(String[] args) {
Thread t=new Thread(new Task());
ExecutorService executorService = Executors.newCachedThreadPool();
Future<?> future=executorService.submit(t);
executorService.shutdown();
try {
//抛出异常
future.get();
}catch (Exception e){
System.out.println("Exception"+e.getMessage());
}
}
多线程非原子操作,如何快速的复现异常
判断>0操作,和减数操作中间的过程越长,越容易复现问题。