多线程的粗浅学习ing

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21325705/article/details/81903534

多线程,最简单的用法就是多个线程。

多个线程一起跑就叫多线程,,,,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

这个挺清楚的。

扫描二维码关注公众号,回复: 4064279 查看本文章
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。

了解彻底理解Java的Future模式,,

https://www.cnblogs.com/cz123/p/7693064.html

。好好学习,差的还有点多

猜你喜欢

转载自blog.csdn.net/qq_21325705/article/details/81903534