最近碰到一个问题,就是用户在填写相关信息提交后,后台需要将一些文件同步到另外一台服务器,而这个时候,由于用的是spring的框架,导致前端页面需要等待文件同步完成,才能弹出提示信息。相信大家在很多时候都会碰到这种问题,比如收发邮件,也会等待邮件发送完成,等等。于是便很自然的想到多开一个线程去处理一些比较耗时的任务。但是java本身只提供类级别的多线程,如下:

  1. 继承Thread类
    class A extends Thread {
    public void run() {
    System.out.println("A");
    } public static void main(String[] args) {
    A a = new A();
    a.run();
    }
    }
  2. 实现Runnable接口
    class B implements Runnable {
    public void run() {
    System.out.println("B");
    } public static void main(String[] args) {
    B b = new B();
    Thread thread = new Thread(b);
    thread.start();
    }
    }
  3. Executor

    可以更方便的创建管理线程池,后期我会用一篇博客详细讲述。

可以看到,这些多线程的实现方式都是集中在类级别上的,必须要一个类实现或继承相应的接口和类,并且重写run方法,才能启动使用。但是,假设在spring的一个类中:

@RequestMapping("/c")
public class C {
//主方法
@RequestMapping("c1")
public void c1() {
//需要开启另一个线程调用c2方法,从而不用等待c2执行完毕
c2();
} //需要实现多线程
public void c2() {
//调用c3
c3();
} //文件同步方法,需要后台执行
public void c3() { }
}

我们要在c2方法中调用后台方法,那么就需要在c1类中调用c2,从而开启另一个线程去执行后台业务代码,而不用等待c3完成

通过上面的几种实现多线程的方式,这个问题是比较难解决的,或者我们新建另一个类去实现多线程:

public class MultiThread implements Runnable {
//后台业务代码
}

然后在c类中调用MultiThread开启多线程。但是既然我们的标题是使用内部类,那么我们来看看用内部类这个问题就会变得比较简单:

内部类实现伪方法级多线程:

我们还是用上面的例子来说明:

@RequestMapping("/c")
public class C {
//主方法
@RequestMapping("c1")
public void c1() {
//需要开启另一个线程调用c2方法,从而不用等待c2执行完毕
//c2(); (new MultiThreadInnerClass()).start();
} //需要实现多线程
public void c2() {
//调用c3
c3();
} //创建内部类集成Thread,调用c3,开启多线程
class MultiThreadInnerClass extends Thread{
public void run {
c3();
}
} //文件同步方法,需要后台执行
public void c3() { }
}

这样就可以实现伪方法级的多线程,在日常的编码中,多用内部类会使代码逻辑更清晰,结构更合理。

Java内部类实现伪方法级多线程的更多相关文章

  1. 143、Java内部类之访问方法中定义的参数或变量

    01.代码如下: package TIANPAN; class Outer { // 外部类 private String msg = "Hello World !"; publi ...

  2. 实践JAVA wait(), notify(),sleep方法--一道多线程的面试题

    建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC. 这个问题用Object的wait(),notify()就可以很方便的解决. publ ...

  3. 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量

    好文转载:http://blog.csdn.net/zhangjg_blog/article/details/19996629 开篇 在我的上一篇博客 深入理解Java中为什么内部类可以访问外部类的成 ...

  4. Java多线程(四)java中的Sleep方法

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

  5. Java-Runoob-高级教程-实例-方法:15. Java 实例 – 重载(overloading)方法中使用 Varargs

    ylbtech-Java-Runoob-高级教程-实例-方法:15. Java 实例 – 重载(overloading)方法中使用 Varargs 1.返回顶部 1. Java 实例 - 重载(ove ...

  6. JAVA运行内部类的main方法

    运行内部类的main方法 定义两个线程: 一个线程的名字"thread1",线程功能输出1~10的阶乘. 另一个线程的名字"thread2",线程功能输出线程的 ...

  7. 线程池(Java中有哪些方法获取多线程)

    线程池(Java中有哪些方法获取多线程) 前言 获取多线程的方法,我们都知道有三种,还有一种是实现Callable接口 实现Runnable接口 实现Callable接口 实例化Thread类 使用线 ...

  8. Java学习笔记——内部类及其调用方法

    一.static内部类的static方法 public class Test0719_Inner_Test { public static void main(String[] args) { //s ...

  9. java内部类的本质

    连接与通信,作为桥接中间件存在. 内部类和主体类可以无障碍通信: 1.通过继承连接实现: 2.通过接口连接通信: 形式: 1.命名空间: 2.运行上下文: 其它: 信息隐藏是次要功能. 内部类 Jav ...

随机推荐

  1. (转)PHP的ereg()与eregi()的不同及相同点。对比

    ereg() 字符串比对解析. 语法: int ereg(string pattern, string string, array [regs]); 返回值: 整数/数组 函数种类: 资料处理 内容说 ...

  2. 7——使用TextView实现跑马灯

    首先给TextView添加一个单行限制: android:singleLine="true" - 解决方案一 更改TextView的一个属性: android:ellipsize= ...

  3. statistic学习笔记

    1. 假设检验:就是对于符合一定前提条件的数据,先作一个假设H0,还有一个备择假设H1(一般是H0的反面,或者是H0不包含的情况),通过一定的计算公式,算出一个值(比如开方检验就是开方值),这个值的理 ...

  4. [LeetCode OJ] Candy

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  5. jQuery 做好七件事帮你提升jQuery的性能

    1. Append Outside of Loops 凡是触及到DOM都是有代价的.如果你向DOM当中附加大量的元素,你会想一次性将它们全部附加进来,而不是分多次进行.当在循环当中附加元素就会产生一个 ...

  6. 初涉JavaScript模式 (12) : 沙箱模式

    引子 上一篇说了模块模式,而对于其中的命名空间模式其实也是有着一些问题,比如每添加一个模块或则深入叠加都会导致长命名,并且对于多个库的不同版本同时运行,一不小心就会污染全局标识,而这两天也发现了JSe ...

  7. phonegap学习入门

    phonegap 开发入门 PhoneGap官方网站上有详细的入门示例教程,这里,我针对使用PhoneGap进行Android移动应用的开发对其官网的Get Started进行一些介绍.补充. Ste ...

  8. Html表格自动换行

    前述: 前端经常用到表格,而表格中的列里面的内容一多,会撑大列的宽度,这个时候如果想要内容不撑大列宽...请看下面的link: link:html表格自动换行

  9. ExtJS5_MVVM特性的简单说明

    下面我们来看一下自动生成的代码中的MVVM架构的关系.Main是一个可视的控件,MainController是这个控件的控制类,MainModel是这个控件的模型类. 在上面的图片中,左边是Main. ...

  10. 转:etc/fstab 文件详解

    etc/fstab这个文件的所有参数,这个文件是非常重要的.这个文件是配置文件系统的体系,创建的所有分区,都必须写在这个文件里面,否则下次启动的时候你的分区是挂不起来的.首先学习一个mount –a ...