多线程,最简单的用法就是多个线程。
多个线程一起跑就叫多线程,,,,emmmm,好尬。
一般用于处理多个任务或多个方法时,这个任务需要处理的时间还比较长,可能会产生多个任务,如果正常的采用for循环的形式进行执行,这样需要等到所有任务都执行完系统才会执行下一步 ,这样会造成许多的时间浪费,这算是同步吧,。这时候就需要采用异步的方法,将这些任务去执行,但是不需要关心后期执行过程,(无返回值要求),这样就不会造成长时间的等待了。这种场景需要用多线程。
还有一种情况,一般的采用runnable接口的多线程,run方法无返回值,但是需要采用多线程,有需要使用这个方法的返回值用于其他计算,这时候需要采用callable接口。可以得到返回值。
1.最简单的多个线程一起跑的多线程。(不知道算不算多线程啦)
设计 4 个线程,其中两个线程每次对 j 增加 1,另外两个线程
对 j 每次减少 1。写出程序。
以下程序使用内部类实现线程,对 j 增减的时候没有考虑顺序问题。
public class ThreadTest {
private int j;
public static void main(String args[]){
ThreadTest tt=new ThreadTest();
Inc inc=tt.new Inc();
Dec dec=tt.new Dec();
for(int i=0;i<2;i++){
Thread t=new Thread(inc);
t.start();
t=new Thread(dec);
t.start();
}
}
private synchronized void inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+ j);
}
private synchronized void dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}
class Inc implements Runnable{
public void run(){
for(int i=0;i<100;i++){
inc();
}
}
}
class Dec implements Runnable{
public void run(){
for(int i=0;i<100;i++){
dec();
}
}
}
这个还算是比较经典的多线程算法题吧,
2,采用ExecuteService形式,使用多线程,runnable
https://blog.csdn.net/wanghao_0206/article/details/76460877
这个挺清楚的。
ExecutorService executorService = null; List<Map<String,Object>> applys = Dao.selectList(msSupplementMapper+"queryLoanApplyAndResult"); if(CollectionUtils.isEmpty(applys)){ return ; } executorService = Executors.newFixedThreadPool(applys.size() > 20 ? 20 : applys.size()); for(final Map<String,Object> apply : applys){ final int status = Integer.parseInt(apply.get("status").toString()); final int mainStatus = Integer.parseInt(apply.get("mainStatus").toString()); executorService.execute(new Runnable() { @Override public void run() { // 放款申请成功 || 已发起放款申请 || 放款成功无正式还款计划 -- 发送放款结果查询 if( (MsStatus.LOAN_APPLY.getCode() == mainStatus && MsStatus.LOAN_APPLY_SUCCESS.getCode() == status) )){ queryLoanResult(apply.get("projectId").toString()); }else{ loanApply(apply.get("projectId").toString()); } } }); }
3,采用ExecutorService形式,利用future。
List<Future<PayableSource>> futureList = new ArrayList<>(sumBeginningList.size()); for(SumBeginning sumBeginning : sumBeginningList){ logger.debug("===== 循环遍历 sumBeginning ====="); ChargeBo<SumBeginningQo> chargeBoToRefer = chargeBo.clone(); chargeBoToRefer.setOperator(UserUtil.getCurrentUser(false)); sumBeginningQo = new SumBeginningQo(); sumBeginningQo.setId(sumBeginning.getId()); chargeBoToRefer.setPayableSourceQueryObj(sumBeginningQo); logger.debug("===== 进入chargeService 逻辑 ====="); futureList.add(executorService.submit(new ChargeService(chargeBoToRefer, SUM_BEGINNING_SERVICE))); } logger.debug("<<<<<SumBeginningService.charge"); return futureList;
new ChargeService 是实现的callable接口,在call方法实现了返回值。
@Override public PayableSource call() throws Exception{ logger.debug(">>>>>ChargeService.call"); RPermitExpirableSemaphore semaphore = null; String permitId = null; try{ PayableSource queryObj = chargeBo.getPayableSourceQueryObj(); PayableSource payableSource = null; if(queryObj instanceof SumBeginningPlusQo){ payableSource = payableService.getPayableSourcePlus(queryObj.getId(), true); logger.debug("===== 代偿跳过扣款验证 ====="); }else{ payableSource = payableService.getPayableSource(queryObj.getId(), true); payableService.validatePayable(payableSource); }
return payableSource; }catch (Exception e){ logger.error("===== ChargeService.call出现异常:", e); Dao.rollback(); if(e instanceof ActionException){ throw e; }else{ throw new ActionException(e.getMessage(), e); } }finally { Dao.close(); if(semaphore != null && permitId != null){ semaphore.release(permitId); } }
上边list采用的Future模式,用来承接callable方法的,具体的还不太了解。。。emmmm。
https://www.cnblogs.com/cz123/p/7693064.html
。好好学习,差的还有点多