最近碰到一個問題,就是用戶在填寫相關信息提交后,后台需要將一些文件同步到另外一台服務器,而這個時候,由於用的是spring的框架,導致前端頁面需要等待文件同步完成,才能彈出提示信息。相信大家在很多時候都會碰到這種問題,比如收發郵件,也會等待郵件發送完成,等等。於是便很自然的想到多開一個線程去處理一些比較耗時的任務。但是java本身只提供類級別的多線程,如下:
-
繼承Thread類
class A extends Thread { public void run() { System.out.println("A"); } public static void main(String[] args) { A a = new A(); a.run(); } }
-
實現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(); } }
-
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() { } }
這樣就可以實現偽方法級的多線程,在日常的編碼中,多用內部類會使代碼邏輯更清晰,結構更合理。