国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Java 多線程 自定義線程輔助

2019-11-14 23:56:11
字體:
供稿:網(wǎng)友
java 多線程 自定義線程輔助

之前的文章我介紹了C#版本的多線程和自定義線程處理器。

接下來我們來看看Java版本的呢

java 的線程和C#的線程有點區(qū)別,java的線程沒有是否是后臺線程一說,具體原因是java的線程是jvm的c++代碼模擬線程,而C#的線程也是C++模擬線程。但是區(qū)別在于C#的線程會基于系統(tǒng)的線程。

C# 的 Thread.IsBackground;

這里唯一的區(qū)別在于,C#開啟線程如果是非后臺線程即便是你關(guān)閉了程序,如果不是強制退出進程的情況下。線程還會繼續(xù)運行,知道垃圾回收機制強制回收。如果設(shè)置了后臺線程標識,關(guān)閉程序就直接退出。

java沒有一說。

java線程有分組和底層線程ID一說。C#沒有。

java的線程可以自定義線程運行接口Runnable 或者 重寫線程run()方法。

其實這些都是大同小異的,區(qū)別性不大。

java線程的基礎(chǔ)知識,到處都是,我不在BB

直接開始整體吧~!

  1 /**  2  * 線程模型  3  *  4  * @author 失足程序員  5  * @Blog http://m.survivalescaperooms.com/ty408/  6  * @mail 492794628@QQ.com  7  * @phone 13882122019  8  *  9  */ 10 public class ThreadModel extends Thread { 11  12     PRivate static final Logger log = Logger.getLogger(TaskModel.class); 13     private static int threadID = 0; 14     private static final Object SYN_OBJECT = new Object(); 15     private long tid; 16     /** 17      * 任務(wù)列表 線程安全的任務(wù)列表 18      */ 19     protected final List<TaskModel> taskQueue = Collections.synchronizedList(new LinkedList<TaskModel>()); 20     //false標識刪除線程 21     private boolean runing = true; 22  23     public ThreadModel(ThreadGroup group) { 24         this(group, "無名"); 25     } 26  27     public ThreadModel(ThreadGroup group, String name) { 28         super(group, name); 29         synchronized (SYN_OBJECT) { 30             threadID++; 31             tid = threadID; 32         } 33     } 34  35     @Override 36     public long getId() { 37         return this.tid; 38     } 39  40     /** 41      * 增加新的任務(wù) 每增加一個新任務(wù),都要喚醒任務(wù)隊列 42      * 43      * @param runnable 44      */ 45     public void addTask(TaskModel runnable) { 46         synchronized (taskQueue) { 47             taskQueue.add(runnable); 48             /* 喚醒隊列, 開始執(zhí)行 */ 49             taskQueue.notify(); 50         } 51     } 52  53     public void setRuning(boolean runing) { 54         this.runing = runing; 55     } 56  57     @Override 58     public void run() { 59         while (runing && ThreadManager.getInstance().isRunning()) { 60             TaskModel r = null; 61             while (taskQueue.isEmpty() && runing && ThreadManager.getInstance().isRunning()) { 62                 try { 63                     /* 任務(wù)隊列為空,則等待有新任務(wù)加入從而被喚醒 */ 64                     synchronized (taskQueue) { 65                         taskQueue.wait(500); 66                     } 67                 } catch (InterruptedException ie) { 68                     log.error(ie); 69                 } 70             } 71             synchronized (taskQueue) { 72                 /* 取出任務(wù)執(zhí)行 */ 73                 if (runing && ThreadManager.getInstance().isRunning()) { 74                     r = taskQueue.remove(0); 75                 } 76             } 77             if (r != null) { 78                 /* 執(zhí)行任務(wù) */ 79                 //r.setSubmitTimeL(); 80                 long submitTime = System.currentTimeMillis(); 81                 try { 82                     r.run(); 83                 } catch (Exception e) { 84                     log.error("工人<“" + Thread.currentThread().getName() + "”> 執(zhí)行任務(wù)<" + r.getID() + "(“" + r.getName() + "”)> 遇到錯誤: " + e); 85                     e.printStackTrace(); 86                 } 87                 long timeL1 = System.currentTimeMillis() - submitTime; 88                 long timeL2 = System.currentTimeMillis() - r.getSubmitTime(); 89                 if (timeL1 <= 100L) { 90                     log.info("工人<“" + Thread.currentThread().getName() + "”> 完成了任務(wù):" + r.toString() + " 執(zhí)行耗時:" + timeL1 + " 提交耗時:" + timeL2); 91                 } else if (timeL1 <= 1000L) { 92                     log.info("工人<“" + Thread.currentThread().getName() + "”> 長時間執(zhí)行 完成任務(wù):" + r.toString() + " “考慮”任務(wù)腳本邏輯 耗時:" + timeL1 + " 提交耗時:" + timeL2); 93                 } else if (timeL1 <= 4000L) { 94                     log.info("工人<“" + Thread.currentThread().getName() + "”> 超長時間執(zhí)行完成 任務(wù):" + r.toString() + " “檢查”任務(wù)腳本邏輯 耗時:" + timeL1 + " 提交耗時:" + timeL2); 95                 } else { 96                     log.info("工人<“" + Thread.currentThread().getName() + "”> 超長時間執(zhí)行完成 任務(wù):" + r.toString() + " “考慮是否應(yīng)該刪除”任務(wù)腳本 耗時:" + timeL1 + " 提交耗時:" + timeL2); 97                 } 98                 r = null; 99             }100         }101         log.error("線程結(jié)束, 工人<“" + Thread.currentThread().getName() + "”>退出");102     }103 104     @Override105     public String toString() {106         return "Thread{" + "tid=" + tid + ",Name=" + this.getName() + '}';107     }108 109 }

這里創(chuàng)建我們自定義的線程模型,有兩點值得注意的是,

protected final List<TaskModel> taskQueue = Collections.synchronizedList(new LinkedList<TaskModel>());
synchronized (taskQueue) {            taskQueue.add(runnable);            /* 喚醒隊列, 開始執(zhí)行 */            taskQueue.notify();        }synchronized (taskQueue) {                        taskQueue.wait(500);                    }

這里我們同樣沒有使用Thread.Sleep();對線程進行暫停,同樣使用的是taskQueue.wait();來進行線程暫停,這是因為當(dāng)任務(wù)隊列為空的時候,需要暫停線程。

當(dāng)新的任務(wù)被放進來的時候,又必須立即開始執(zhí)行任務(wù)。

為了防止線程永久暫停,設(shè)置的是500毫秒,這樣我們需要關(guān)閉程序(ThreadManager.getInstance().isRunning()==false)停止線程時候他會自定停止。

輔助鍵值對存儲器

  1 /**  2  * 輔助鍵值對存儲  3  *  4  * @author 失足程序員  5  * @Blog http://m.survivalescaperooms.com/ty408/  6  * @mail 492794628@qq.com  7  * @phone 13882122019  8  */  9 public class ObjectAttribute extends HashMap<String, Object> { 10  11     private static final long serialVersionUID = -5320260807959251398L; 12  13     /** 14      * 調(diào)用此方法 刪除值是需要保證存在key值和value值 否則空指針報錯 15      * 16      * @param <T> 17      * @param key 18      * @param clazz 19      * @return 20      * @deprecated 需要保證存在key值和value值 否則空指針報錯 慎重 21      */ 22     @Deprecated 23     public <T extends Object> T remove(String key, Class<T> clazz) { 24         Object obj = this.remove(key); 25         return (T) obj; 26     } 27  28     /** 29      * 如果未找到也返回 null 30      * 31      * @param key 32      * @return 33      */ 34     public String getStringValue(String key) { 35         if (this.containsKey(key)) { 36             return this.get(key).toString(); 37         } 38         return null; 39     } 40  41     /** 42      * 如果未找到也返回 0 43      * 44      * @param key 45      * @return 46      */ 47     public int getintValue(String key) { 48         if (this.containsKey(key)) { 49             return (int) (this.get(key)); 50         } 51         return 0; 52     } 53  54     /** 55      * 如果未找到也返回 null 56      * 57      * @param key 58      * @return 59      */ 60     public Integer getIntegerValue(String key) { 61         if (this.containsKey(key)) { 62             return (Integer) (this.get(key)); 63         } 64         return null; 65     } 66  67     /** 68      * 如果未找到也返回 0 69      * 70      * @param key 71      * @return 72      */ 73     public long getlongValue(String key) { 74         if (this.containsKey(key)) { 75             return (long) (this.get(key)); 76         } 77         return 0; 78     } 79  80     /** 81      * 如果未找到也返回 null 82      * 83      * @param key 84      * @return 85      */ 86     public Long getLongValue(String key) { 87         if (this.containsKey(key)) { 88             return (Long) (this.get(key)); 89         } 90         return null; 91     } 92  93     /** 94      * 如果未找到也返回 0 95      * 96      * @param key 97      * @return 98      */ 99     public float getfloatValue(String key) {100         if (this.containsKey(key)) {101             return (float) (this.get(key));102         }103         return 0;104     }105 106     /**107      * 如果未找到也返回 null108      *109      * @param key110      * @return111      */112     public Float getFloatValue(String key) {113         if (this.containsKey(key)) {114             return (Float) (this.get(key));115         }116         return null;117     }118 119     /**120      * 如果未找到也返回 false121      *122      * @param key123      * @return124      */125     public boolean getbooleanValue(String key) {126         if (this.containsKey(key)) {127             return (boolean) (this.get(key));128         }129         return false;130     }131 132     /**133      * 如果未找到也返回 null134      *135      * @param key136      * @return137      */138     public Boolean getBooleanValue(String key) {139         if (this.containsKey(key)) {140             return (Boolean) (this.get(key));141         }142         return null;143     }144 145     @Override146     public Object clone() {147         return super.clone(); //To change body of generated methods, choose Tools | Templates.148     }149 }
View Code

任務(wù)執(zhí)行模型

 1 /** 2  * 任務(wù)模型 3  * 4  * @author 失足程序員 5  * @Blog http://m.survivalescaperooms.com/ty408/ 6  * @mail 492794628@qq.com 7  * @phone 13882122019 8  * 9  */10 public abstract class TaskModel {11 12     private static final Logger log = Logger.getLogger(TaskModel.class);13 14     private long ID;15     private String Name;16     //運行時數(shù)據(jù)17     private ObjectAttribute runAttribute = new ObjectAttribute();18 19     public TaskModel(long ID, String Name) {20         this.ID = ID;21         this.Name = Name;22         this.runAttribute.put("submitTime", System.currentTimeMillis());23     }24 25     public TaskModel() {26         this(0, "無名");27     }28 29     public long getSubmitTime() {30         return this.runAttribute.getlongValue("submitTime");31     }32 33     public ObjectAttribute getRunAttribute() {34         return runAttribute;35     }36 37     public void setRunAttribute(ObjectAttribute runAttribute) {38         this.runAttribute = runAttribute;39     }40 41     public long getID() {42         return ID;43     }44 45     public String getName() {46         return Name;47     }48 49     public abstract void run();50 51     @Override52     public String toString() {53         return "TaskModel{" + "ID=" + ID + ", Name=" + Name + ", runAttribute=" + runAttribute + '}';54     }55 56 }

接下來我們測試一下

1   ThreadModel threadModel = new ThreadModel(new ThreadGroup("Test"), "Test");2         threadModel.start();3         threadModel.addTask(new TaskModel() {4 5             @Override6             public void run() {7                 System.out.println("TaskModel Test");8             }9         });

執(zhí)行結(jié)果

TaskModel Test[04-24 17:31:26:0223:INFO : sz.network.threadpool.TaskModel:97 行] -> 工人<“Test”> 完成了任務(wù):TaskModel{ID=0, Name=無名, runAttribute={submitTime=1429867886219}} 執(zhí)行耗時:0 提交耗時:4

我們看到居然有提交耗時,,別奇怪,,因為在某些情況下,線程的從暫停狀態(tài)到喚醒狀態(tài)需要消耗時間的,系統(tǒng)不可能有那么多空閑資源,收到你的命令馬上就放棄一切事情執(zhí)行你的命令。

我們調(diào)試運行時可以看見當(dāng)前程序所有線程,以及分組情況(我使用的是NetBeans IDE 8.0.2 開發(fā)工具)

接下來我們來構(gòu)建一下。后臺線程池,

 1 /** 2  * 后臺線程池 3  * 4  * @author 失足程序員 5  * @Blog http://m.survivalescaperooms.com/ty408/ 6  * @mail 492794628@qq.com 7  * @phone 13882122019 8  */ 9 class BackThread {10 11     private static final Logger log = Logger.getLogger(BackThread.class);12 13     private final ThreadGroup threadGroup = new ThreadGroup(ThreadManager.getGlobeThreadGroup(), "后臺執(zhí)行器");14 15     /* 任務(wù)列表 */16     private final List<TaskModel> taskQueue = Collections.synchronizedList(new LinkedList<TaskModel>());17     private final BackThreadRunnable backThreadRunnable = new BackThreadRunnable();18 19     public BackThread() {20         int threadcountI = 10;21         for (int i = 1; i <= threadcountI; i++) {22             Thread thread = new Thread(threadGroup, backThreadRunnable, "后臺線程-" + i);23             thread.start();24         }25         log.info("---初始化后臺線程池--線程數(shù)量:" + threadcountI + "------------");26     }27 28     /**29      * 增加新的任務(wù) 每增加一個新任務(wù),都要喚醒任務(wù)隊列30      *31      * @param newTask32      */33     public void addTask(TaskModel newTask) {34         synchronized (taskQueue) {35             taskQueue.add(newTask);36             /* 喚醒隊列, 開始執(zhí)行 */37             taskQueue.notify();38         }39     }40 41     final class BackThreadRunnable implements Runnable {42 43         /**44          * 循環(huán)執(zhí)行任務(wù)45          */46         @Override47         public void run() {48             while (ThreadManager.getInstance().isRunning()) {49                 TaskModel r = null;50                 synchronized (taskQueue) {51                     while (taskQueue.isEmpty() && ThreadManager.getInstance().isRunning()) {52                         try {53                             /* 任務(wù)隊列為空,則等待有新任務(wù)加入從而被喚醒 */54                             taskQueue.wait(500);55                         } catch (InterruptedException ie) {56                             log.error(ie);57                         }58                     }59                     /* 取出任務(wù)執(zhí)行 */60                     if (ThreadManager.getInstance().isRunning()) {61                         r = taskQueue.remove(0);62                     }63                 }64                 if (r != null) {65                     /* 執(zhí)行任務(wù) */66                     //r.setSubmitTimeL();67                     long submitTime = System.currentTimeMillis();68                     try {69                         r.run();70                     } catch (Exception e) {71                         e.printStackTrace();72                         log.error("工人<“" + Thread.currentThread().getName() + "”> 執(zhí)行任務(wù)<" + r.getID() + "(“" + r.getName() + "”)> 遇到錯誤: " + e);73                     }74                     long timeL1 = System.currentTimeMillis() - submitTime;75                     long timeL2 = System.currentTimeMillis() - r.getSubmitTime();76                     if (timeL1 <= 100L) {77                         log.info("工人<“" + Thread.currentThread().getName() + "”> 完成了任務(wù):" + r.toString() + " 執(zhí)行耗時:" + timeL1 + " 提交耗時:" + timeL2);78                     } else if (timeL1 <= 1000L) {79                         log.info("工人<“" + Thread.currentThread().getName() + "”> 長時間執(zhí)行 完成任務(wù):" + r.toString() + " “考慮”任務(wù)腳本邏輯 耗時:" + timeL1 + " 提交耗時:" + timeL2);80                     } else if (timeL1 <= 4000L) {81                         log.info("工人<“" + Thread.currentThread().getName() + "”> 超長時間執(zhí)行完成 任務(wù):" + r.toString() + " “檢查”任務(wù)腳本邏輯 耗時:" + timeL1 + " 提交耗時:" + timeL2);82                     } else {83                         log.info("工人<“" + Thread.currentThread().getName() + "”> 超長時間執(zhí)行完成 任務(wù):" + r.toString() + " “考慮是否應(yīng)該刪除”任務(wù)腳本 耗時:" + timeL1 + " 提交耗時:" + timeL2);84                     }85                     r = null;86                 }87             }88             log.error("線程結(jié)束, 工人<“" + Thread.currentThread().getName() + "”>退出");89         }90     }91 }

以及定時器線程處理器

 1 /** 2  * 定時器線程 3  * 4  * @author 失足程序員 5  * @Blog http://m.survivalescaperooms.com/ty408/ 6  * @mail 492794628@qq.com 7  * @phone 13882122019 8  */ 9 class TimerThread extends ThreadModel {10 11     private static final Logger log = Logger.getLogger(TimerThread.class);12 13     public TimerThread() {14         super(ThreadManager.getGlobeThreadGroup(), "全局定時器線程");15         this.start();16     }17 18     @Override19     public void run() {20         while (ThreadManager.getInstance().isRunning()) {21             while (ThreadManager.getInstance().isRunning() && taskQueue.isEmpty()) {22                 try {23                     /* 任務(wù)隊列為空,則等待有新任務(wù)加入從而被喚醒 */24                     synchronized (taskQueue) {25                         taskQueue.wait(200);26                     }27                 } catch (InterruptedException ie) {28                 }29             }30             ArrayList<TaskModel> taskModels;31             synchronized (taskQueue) {32                 //隊列不為空的情況下  取出隊列定時器任務(wù)33                 taskModels = new ArrayList<>(taskQueue);34             }35             if (!taskModels.isEmpty()) {36                 for (TaskModel task : taskModels) {37                     TimerTask timerEvent = (TimerTask) task;38                     int execCount = timerEvent.getRunAttribute().getintValue("Execcount");39                     long lastTime = timerEvent.getRunAttribute().getlongValue("LastExecTime");40                     long nowTime = System.currentTimeMillis();41                     if (nowTime > timerEvent.getStartTime() //是否滿足開始時間42                             && (nowTime - timerEvent.getSubmitTime() > timerEvent.getIntervalTime())//提交以后是否滿足了間隔時間43                             && (timerEvent.getEndTime() <= 0 || nowTime < timerEvent.getEndTime()) //判斷結(jié)束時間44                             && (nowTime - lastTime >= timerEvent.getIntervalTime())) //判斷上次執(zhí)行到目前是否滿足間隔時間45                     {46                         //提交執(zhí)行47                         ThreadManager.getInstance().addTask(timerEvent.gettID(), timerEvent);48                         //記錄49                         execCount++;50                         timerEvent.getRunAttribute().put("Execcount", execCount);51                         timerEvent.getRunAttribute().put("LastExecTime", nowTime);52                     }53                     nowTime = System.currentTimeMillis();54                     //判斷刪除條件55                     if ((timerEvent.getEndTime() > 0 && nowTime < timerEvent.getEndTime())56                             || (timerEvent.getActionCount() > 0 && timerEvent.getActionCount() <= execCount)) {57                         taskQueue.remove(task);58                     }59                 }60             }61             try {62                 //定時器, 執(zhí)行方式 間隔 4ms 執(zhí)行一次 把需要處理的任務(wù)放到對應(yīng)的處理線程63                 Thread.sleep(4);64             } catch (InterruptedException ex) {65             }66         }67         log.error("線程結(jié)束, 工人<“" + Thread.currentThread().getName() + "”>退出");68     }69 70     @Override71     public void addTask(TaskModel task) {72         if (((TimerTask) task).isIsStartAction()) {73             try {74                 task.run();75             } catch (Exception e) {76                 log.error("工人<“" + Thread.currentThread().getName() + "”> 執(zhí)行任務(wù)<" + task.getID() + "(“" + task.getName() + "”)> 遇到錯誤: " + e);77                 e.printStackTrace();78             }79         }80         super.addTask(task);81     }82 }

定時器線程執(zhí)行任務(wù)模型

  1 /**  2  * 定時器執(zhí)行器  3  *  4  * @author 失足程序員  5  * @Blog http://m.survivalescaperooms.com/ty408/  6  * @mail 492794628@qq.com  7  * @phone 13882122019  8  */  9 public abstract class TimerTask extends TaskModel { 10  11     private static final long serialVersionUID = -8331296295264699207L; 12  13     /** 14      * 線程ID 15      */ 16     private long tID; 17     /** 18      * 開始執(zhí)行的時間 19      */ 20     private long startTime; 21  22     /** 23      * 是否一開始執(zhí)行一次 24      */ 25     private boolean isStartAction; 26  27     /** 28      * 結(jié)束時間 29      */ 30     private long endTime; 31  32     /** 33      * 執(zhí)行次數(shù) 34      */ 35     private int actionCount; 36  37     /** 38      * 間隔執(zhí)行時間 39      */ 40     private int intervalTime; 41  42     /** 43      * 44      * @param tID 指定執(zhí)行線程 45      * @param startTime 指定開始時間 46      * @param isStartAction 是否一開始就執(zhí)行一次 47      * @param endTime 指定結(jié)束時間 48      * @param actionCount 指定執(zhí)行次數(shù) 49      * @param intervalTime 指定間隔時間 50      * @param ID 51      * @param Name 52      */ 53     public TimerTask(long tID, long startTime, boolean isStartAction, long endTime, int actionCount, int intervalTime, long ID, String Name) { 54         super(ID, Name); 55         this.tID = tID; 56         this.startTime = startTime; 57         this.isStartAction = isStartAction; 58         this.endTime = endTime; 59         this.actionCount = actionCount; 60         this.intervalTime = intervalTime; 61     } 62  63     /** 64      * 指定任務(wù)的開始執(zhí)行時間 65      * 66      * @param tID 指定執(zhí)行線程 67      * @param startTime 指定開始時間 68      * @param isStartAction 是否一開始就執(zhí)行一次 69      * @param actionCount 指定執(zhí)行次數(shù) 70      * @param intervalTime 指定間隔時間 71      * @param ID 72      * @param Name 73      */ 74     public TimerTask(long tID, long startTime, boolean isStartAction, int actionCount, int intervalTime, long ID, String Name) { 75         this(tID, startTime, isStartAction, 0, actionCount, intervalTime, ID, Name); 76     } 77  78     /** 79      * 指定結(jié)束時間已結(jié)束時間為準,執(zhí)行次數(shù)不一定夠 80      * 81      * @param tID 指定執(zhí)行線程 82      * @param isStartAction 是否一開始就執(zhí)行一次 83      * @param endTime 指定結(jié)束時間 84      * @param actionCount 指定執(zhí)行次數(shù) 85      * @param intervalTime 指定間隔時間 86      * @param ID 87      * @param Name 88      */ 89     public TimerTask(long tID, boolean isStartAction, long endTime, int actionCount, int intervalTime, long ID, String Name) { 90         this(tID, 0, isStartAction, endTime, actionCount, intervalTime, ID, Name); 91     } 92  93     /** 94      * 指定開始時間,和結(jié)束時間 95      * 96      * @param tID 指定執(zhí)行線程 97      * @param startTime 指定開始時間 98      * @param endTime 指定結(jié)束時間 99      * @param intervalTime 指定間隔時間100      * @param ID101      * @param Name102      */103     public TimerTask(long tID, long startTime, long endTime, int intervalTime, long ID, String Name) {104         this(tID, startTime, false, endTime, -1, intervalTime, ID, Name);105     }106 107     /**108      * 指定執(zhí)行線程,指定執(zhí)行次數(shù),指定間隔時間109      *110      * @param tID 指定執(zhí)行線程111      * @param actionCount 指定執(zhí)行次數(shù)112      * @param intervalTime 指定間隔時間113      * @param ID114      * @param Name115      */116     public TimerTask(long tID, int actionCount, int intervalTime, long ID, String Name) {117         this(tID, 0, false, 0, actionCount, intervalTime, ID, Name);118     }119 120     /**121      * 指定的執(zhí)行次數(shù)和間隔時間122      *123      * @param actionCount 指定執(zhí)行次數(shù)124      * @param intervalTime 指定間隔時間125      */126     public TimerTask(int actionCount, int intervalTime) {127         this(0, 0, false, 0, actionCount, intervalTime, 0, "無名");128     }129 130     /**131      * 提交后指定的時間以后執(zhí)行一次132      *133      * @param intervalTime 指定間隔時間134      */135     public TimerTask(int intervalTime) {136         this(0, 0, false, 0, 1, intervalTime, 0, "無名");137     }138 139     public long gettID() {140         return tID;141     }142 143     public void settID(long tID) {144         this.tID = tID;145     }146 147     public long getStartTime() {148         return startTime;149     }150 151     public void setStartTime(long startTime) {152         this.startTime = startTime;153     }154 155     public boolean isIsStartAction() {156         return isStartAction;157     }158 159     public void setIsStartAction(boolean isStartAction) {160         this.isStartAction = isStartAction;161     }162 163     public long getEndTime() {164         return endTime;165     }166 167     public void setEndTime(long endTime) {168         this.endTime = endTime;169     }170 171     public int getActionCount() {172         return actionCount;173     }174 175     public void setActionCount(int actionCount) {176         this.actionCount = actionCount;177     }178 179     public int getIntervalTime() {180         return intervalTime;181     }182 183     public void setIntervalTime(int intervalTime) {184         this.intervalTime = intervalTime;185     }186 187 }

創(chuàng)建一個線程管理器

 1 /** 2  * 線程管理器 3  * 4  * @author 失足程序員 5  * @Blog http://m.survivalescaperooms.com/ty408/ 6  * @mail 492794628@qq.com 7  * @phone 13882122019 8  * 9  */10 public class ThreadManager {11 12     private static final Logger log = Logger.getLogger(ThreadManager.class);13 14     private static final ThreadGroup GlobeThreadGroup = new ThreadGroup("全局線程");15     private static final ThreadGroup lsThreadGroup = new ThreadGroup("零時線程");16 17     private static ThreadManager instance = new ThreadManager();18 19     private static final HashMap<Long, ThreadModel> workThreadMaps = new HashMap<>(0);20 21     public static ThreadManager getInstance() {22         return instance;23     }24 25     public static ThreadGroup getGlobeThreadGroup() {26         return GlobeThreadGroup;27     }28 29     private final BackThread backThread = new BackThread();30 31     private final TimerThread timerThread = new TimerThread();32 33     //服務(wù)器是否運行狀態(tài)標識34     private boolean running = true;35 36     public boolean isRunning() {37         return running;38     }39 40     public void StopServer() {41         running = false;42     }43 44     public long addThread(ThreadModel thread) {45         workThreadMaps.put(thread.getId(), thread);46         thread.start();47         return thread.getId();48     }49 50     public long getThread(ThreadGroup threadGroup, String workName) {51         return addThread(new ThreadModel(threadGroup, workName));52     }53 54     public long getThread(String workName) {55         return addThread(new ThreadModel(lsThreadGroup, workName));56     }57 58     public boolean delete(long threadID) {59         ThreadModel get = workThreadMaps.remove(threadID);60         if (get != null) {61             get.setRuning(false);62             return true;63         }64         return false;65     }66 67     public void addTask(long threadID, TaskModel task) {68         if (workThreadMaps.containsKey(threadID)) {69             workThreadMaps.get(threadID).addTask(task);70         } else {71             addBackTask(task);72         }73     }74 75     public void addTimerTask(TimerTask task) {76         timerThread.addTask(task);77     }78 79     /**80      *81      * @param task82      */83     public void addBackTask(TaskModel task) {84         backThread.addTask(task);85     }86 87 }
View Code

重新測試一下

 1 public static void main(String[] args) { 2  3         long thread = ThreadManager.getInstance().getThread("Test"); 4         ThreadManager.getInstance().addBackTask(new TaskModel() { 5  6             @Override 7             public void run() { 8                 System.out.println("addBackTask"); 9             }10         });11         ThreadManager.getInstance().addTimerTask(new TimerTask(5, 100) {12 13             @Override14             public void run() {15                 System.out.println("TimerTask 5 100");16             }17         });18         ThreadManager.getInstance().addTask(thread, new TaskModel() {19 20             @Override21             public void run() {22                 System.out.println("Thread test");23             }24         });25     }

 1 [04-24 17:40:23:0883:INFO : sz.network.threadpool.BackThread:37 行] -> ---初始化后臺線程池--線程數(shù)量:10------------ 2 addBackTask 3 Thread test 4 [04-24 17:40:23:0888:INFO : sz.network.threadpool.BackThread:89 行] -> 工人<“后臺線程-10”> 完成了任務(wù):TaskModel{ID=0, Name=無名, runAttribute={submitTime=1429868423887}} 執(zhí)行耗時:0 提交耗時:0 5 [04-24 17:40:23:0888:INFO : sz.network.threadpool.TaskModel:97 行] -> 工人<“Test”> 完成了任務(wù):TaskModel{ID=0, Name=無名, runAttribute={submitTime=1429868423887}} 執(zhí)行耗時:1 提交耗時:1 6 TimerTask 5 100 7 [04-24 17:40:23:0988:INFO : sz.network.threadpool.BackThread:89 行] -> 工人<“后臺線程-9”> 完成了任務(wù):TaskModel{ID=0, Name=無名, runAttribute={LastExecTime=1429868423988, submitTime=1429868423887, Execcount=1}} 執(zhí)行耗時:0 提交耗時:101 8 TimerTask 5 100 9 [04-24 17:40:24:0088:INFO : sz.network.threadpool.BackThread:89 行] -> 工人<“后臺線程-8”> 完成了任務(wù):TaskModel{ID=0, Name=無名, runAttribute={LastExecTime=1429868424088, submitTime=1429868423887, Execcount=2}} 執(zhí)行耗時:0 提交耗時:20110 TimerTask 5 10011 [04-24 17:40:24:0189:INFO : sz.network.threadpool.BackThread:89 行] -> 工人<“后臺線程-7”> 完成了任務(wù):TaskModel{ID=0, Name=無名, runAttribute={LastExecTime=1429868424189, submitTime=1429868423887, Execcount=3}} 執(zhí)行耗時:0 提交耗時:30212 TimerTask 5 10013 [04-24 17:40:24:0289:INFO : sz.network.threadpool.BackThread:89 行] -> 工人<“后臺線程-6”> 完成了任務(wù):TaskModel{ID=0, Name=無名, runAttribute={LastExecTime=1429868424289, submitTime=1429868423887, Execcount=4}} 執(zhí)行耗時:0 提交耗時:40214 TimerTask 5 10015 [04-24 17:40:24:0389:INFO : sz.network.threadpool.BackThread:89 行] -> 工人<“后臺線程-9”> 完成了任務(wù):TaskModel{ID=0, Name=無名, runAttribute={LastExecTime=1429868424389, submitTime=1429868423887, Execcount=5}} 執(zhí)行耗時:0 提交耗時:502

調(diào)試查看線程信息

Java版本的自定義線程處理器就算完成了。

功能和實現(xiàn)基本和C#版本一樣。

C# 線程系列三 定時器線程

c# 多線程系列二 自定義線程執(zhí)行器


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 乐东| 庆云县| 屏东县| 高唐县| 龙海市| 金溪县| 卓资县| 长武县| 乐陵市| 贡山| 桃源县| 台州市| 金沙县| 南华县| 永兴县| 呼图壁县| 西华县| 连平县| 定州市| 望江县| 安义县| 恭城| 房产| 林口县| 金湖县| 那曲县| 进贤县| 融水| 石家庄市| 平泉县| 吉林市| 丰顺县| 揭东县| 麻阳| 红原县| 西乌珠穆沁旗| 北流市| 沂水县| 宜兴市| 南昌市| 嘉峪关市|