守護執行緒保證主執行緒不斷掉
1.主執行緒
package com.project.cache; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.Date; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; import javax.annotation.PostConstruct; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.project.entity.UserEntity; import com.project.entity.YeZhuEntity; import com.project.service.DaiLiEntityService; import com.project.service.LogEntityService; import com.project.service.UserEntityService; import com.project.service.YeZhuEntityService; import com.project.utils.HTTPUtils; @Configuration public class LieYData{ private Logger logger = Logger.getLogger(LieYData.class); @Autowired private YeZhuEntityService yeZhuEntityServiceImpl; @Autowired private UserEntityService userEntityServiceImpl; @Autowired private DaiLiEntityService daiLiEntityServiceImpl; @Autowired public LogEntityService logEntityService; @PostConstruct public void init(){ FutureTask<String> task = new FutureTask<String>(new Callable<String>(){ @Override public String call() throws Exception { loadData(); //使用另一個執行緒來執行該方法,會避免佔用Tomcat的啟動時間 return "init ok"; } }); Thread thread = new Thread(task); thread.start(); //啟動守護執行緒,監聽該執行緒是否斷掉 Thread guardThread = new Thread(new GuardThread(thread)); guardThread.setDaemon(true); guardThread.start(); } public void loadData() { try { //確定服務地址 String token = getToken(); String urls = "http://111.11.111.11:8100/stream?cname=0a40ac1547044518b6cdd0b3ee1a9303&token=" + token; URL url = new URL(urls); InputStream in=url.openStream(); int n = -1; byte[] b = new byte[1024]; //從服務端讀取資料並列印 StringBuffer sb = new StringBuffer(); Date startDate = new Date(); while((n=in.read(b))!=-1) { String s=new String(b,0,n, "UTF-8"); Date endDate = new Date(); if(endDate.getTime() - startDate.getTime() < 25*1000){ sb.append(s); }else{ startDate = endDate; logger.info("LieYData:"+sb.toString()); todo(sb.toString()); sb.setLength(0); sb.append(s); } } } catch (Exception e) { e.printStackTrace(); } } private void todo(String datas) { String[] datass = datas.split("\n"); for (String data : datass) { JSONObject js = JSON.parseObject(data); String contentStr = js.getString("content"); logger.info("獵鷹執行緒名" + Thread.currentThread().getName()); if(StringUtils.isBlank(contentStr)){ continue; } JSONObject content = JSON.parseObject(contentStr); if(StringUtils.equals(content.getString("method"), "addUser")){ //h5註冊使用者1 UserEntity record = content.getObject("data", UserEntity.class); int ss = userEntityServiceImpl.addUserEntity(record); log("000", "000", "000", 6, "addUser", "000",contentStr, ss > 0?true:false); }else if(StringUtils.equals(content.getString("method"), "updateUser")){ //h5註冊使用者2 UserEntity record = content.getObject("data", UserEntity.class); int ss = userEntityServiceImpl.updateUserEntityByKeyM(record); log("000", "000", "000", 6, "updateUser", "000",contentStr, ss > 0?true:false); }else if(StringUtils.equals(content.getString("method"), "addYeZhu")){ //h5新增業主 YeZhuEntity record = content.getObject("data", YeZhuEntity.class); String userUuid = content.getString("userUuid"); int ss = yeZhuEntityServiceImpl.addYeZhuEntityM(record, userUuid); log("000", "000", "000", 6, "addYeZhu", "000",contentStr, ss > 0?true:false); }else if(StringUtils.equals(content.getString("method"), "updateYeZhu")){ //h5修改業主 YeZhuEntity record = content.getObject("data", YeZhuEntity.class); String userUuid = content.getString("userUuid"); int ss = yeZhuEntityServiceImpl.updateYeZhuEntityByKeyM(record, userUuid); log("000", "000", "000", 6, "updateYeZhu", "000",contentStr, ss > 0?true:false); }else if(StringUtils.equals(content.getString("method"), "resetYzcode") || StringUtils.equals(content.getString("method"), "login") ){ //h5重置業主code @SuppressWarnings("unchecked") List<String> uuidIds = content.getObject("data", List.class); String yezhucode = content.getString("yezhucode"); String zukecode = content.getString("zukecode"); boolean flag = yeZhuEntityServiceImpl.resetYzcodeM(uuidIds, yezhucode, zukecode); log("000", "000", "000", 6, "resetYzcode", "000",contentStr, flag); } } } //得到token private String getToken() throws MalformedURLException{ String url = "http://111.11.11.11:11101/MicroRecon/1.2/datajoin_manage?action=get_token&vender_id=0a40ac1547044518b6cdd0b3ee1a9303&data_type=cbf1cfa898094c0ab9ff42c74318441d"; String ss = HTTPUtils.post(new URL(url), new JSONObject().toJSONString()); if(StringUtils.isNotBlank(ss)){ JSONObject js = JSON.parseObject(ss); JSONObject jsonResponse = js.getJSONObject("response"); return jsonResponse.getString("token"); } return null; } //日誌 private void log(String ip , String userId,String realName,int type,String moduleId,String moduleName,String description,boolean result){ logEntityService.log(ip, userId, realName, type, moduleId, moduleName, description, result); } }
2.守護執行緒
package com.project.cache; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; import org.apache.log4j.Logger; /* * 守護執行緒,監聽從獵鷹平臺讀取資料的執行緒 */ public class GuardThread implements Runnable{ private Logger logger = Logger.getLogger(LieYData.class); private Thread thread; public GuardThread(Thread thread){ this.thread = thread; } @Override public void run() { while (true) { monitor(); try { Thread.sleep(5*1000); logger.info("守護執行緒:"+Thread.currentThread().getName()); } catch (InterruptedException e) { logger.error("守護執行緒異常"); e.printStackTrace(); } } } /** * 監控主要邏輯 */ private void monitor() { Thread.State state = thread.getState(); //如果被監控執行緒為終止狀態,則重啟被監控的執行緒 if (Thread.State.TERMINATED.equals(state)) { logger.info(thread.getName() + "被監控執行緒已經終止,現在開始重啟被監控的執行緒!"); FutureTask<String> task = new FutureTask<String>(new Callable<String>(){ @Override public String call() throws Exception { new LieYData().loadData(); return "init ok"; } }); Thread thread = new Thread(task); thread.start(); this.thread = thread; } } }
相關推薦
守護執行緒保證主執行緒不斷掉
1.主執行緒package com.project.cache; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util
toast彈框、imageview、進度條、子執行緒訪問主執行緒(執行緒中的通訊handler)
1、imageview ?xml version="1.0" encoding="utf-8"?> <ImageView android:layout_width=“200dp” android:layout_marginLeft=“100dp” an
Java多執行緒--讓主執行緒等待子執行緒執行完畢
參考連結:https://www.cnblogs.com/eoss/p/5902939.html 使用Java多執行緒程式設計時經常遇到主執行緒需要等待子執行緒執行完成以後才能繼續執行,那麼接下來介紹一種簡單的方式使主執行緒等待。 java.util.concurrent.CountDown
Qt中通過訊號和槽在子執行緒和主執行緒中進行資料傳遞
QT中兩個執行緒之間進行自定義型別資料傳遞 兩個執行緒中進行資料傳遞時,傳遞的資料放到佇列中(queue),所以在這個過程中,需要在傳遞前將資料拷貝、儲存到佇列中;為了儲存這些引數,Qt需要construct、destruct、copy這些物件,為了讓Qt知道
進度條與子執行緒訪問主執行緒
1.進度條(ProgressBar) 進度條的屬性: style=”?android:attr/progressBarStyleHorizontal” 預設為圓形 android:progress=”33” 進度條進行到的當前位置(去activity
Unity子執行緒與主執行緒互動(委託方式)
using System; using System.Collections; using System.Collections.Generic; using System.Threading; using UnityEngine; /// <summary> /// 子執行緒與主執行
建立ABC三條執行緒 保證 A執行緒 列印 我 B執行緒列印愛 C執行緒 列印你 如此需要 10個我愛你
public class DoSome implements Runnable{ //三個變數 三條執行緒之間切換執行 一把鎖是不夠的 2把鎖把鎖 物件有鎖的定義 Object物件 private String word;//執行緒要列印的字
java在子執行緒與主執行緒傳遞資料(回撥函式)
預習知識點: 什麼是回撥函式? 下面是知乎大神的回答,簡直不能再精闢 程式碼: package kun.thread; public class THread { static C c=new C(); //flag用來標誌子執行緒執行結束 stati
JAVA主執行緒等待所有子執行緒執行完成後主執行緒再執行
如標題,此功能主要是JDK1.5引入的java.util.concurrent包下的CountDownLatch類,此類據介紹為以執行緒輔助類,通過執行緒計數器來實現一個或多個主執行緒等待其下所有子執行緒執行完後主執行緒再繼續執行的功能。
Java 執行緒池主執行緒等待子執行緒awaitTermination方法使用詳解
Java中在使用Executors執行緒池時,有時場景需要主執行緒等各子執行緒都執行完畢後再執行。這時候就需要用到ExecutorService介面中的awaitTermination方法,我們來看看原始碼中對該方法的說明:大概意思是這樣的:該方法呼叫會被阻塞,並且在
qt4 子執行緒給主執行緒發訊息,發資料,通訊,qthread gui postevent emit
【轉帖請註明出處:blog.csdn.net/lanmanck】 用了qthread後,自然想起給gui執行緒傳送資料。 在qt4中,QCustomEvent已經不使用了。因為qthread是從QObject繼承的,所以可以使用signal,slot機制來通訊。 1、線
Java子執行緒和主執行緒交替輸出(一個簡單的例項)
實現主執行緒和子執行緒的交替輸出列印,首先建立一個實現執行緒方法的Service public class Service { private volatile boolean flag = false; //這是一個控制sub和mian的開關,加關鍵字volatil
[Java][Android] 多執行緒同步-主執行緒等待所有子執行緒完成案例
有時候我們會遇到這樣的問題:做一個大的事情可以被分解為做一系列相似的小的事情,而小的事情無非就是引數上有可能不相同而已! 此時,如果不使用執行緒,我們勢必會浪費非常多的時間來完成整個大的事情,而使用執行緒的話將會存在這樣的問題: 主執行緒啟動所有子執行緒併發執行後主執行緒就
MFC子執行緒訪問主執行緒對話方塊程式的控制元件物件
最近在使用 VC 開發軟體時需要用到多執行緒同步來解決開發過程中遇到的問題。本來以為只要象控制檯程式一樣,在主執行緒建立子執行緒,並設定好相應的物件事件就能解決問題,但是等到真正做起來,才在實踐中發現原來事情並沒有我想象的那麼簡單。以下我介紹一下我在開發過程中
Android子執行緒給主執行緒傳送訊息
Android執行緒機制和Java幾乎一樣,基本用法還是有兩種 新建一個類繼承Thread類 實現Runnable介面的方式定義一個執行緒 兩種方法都需要覆寫run方法,並用start方法啟動 1.new MyTread().start(); 2.n
多執行緒demo-主執行緒和子執行緒交替執行
package Thread; /** * 實現效果:主執行緒執行10次,子執行緒執行100次,主執行緒和子執行緒迴圈交替執行50次 主要演示synchronized和wait、notify的使用 * 適用場景:只有兩個執行緒的情況,呵呵 */ public c
Android使用Handler實現子執行緒與子執行緒、主執行緒之間通訊
今天這篇文章只講一下怎麼使用Handler實現子執行緒與子執行緒之間、子執行緒與主執行緒之間如何進行通訊,關於具體的內部實現因為我也沒研究過,所以這篇文章講不了。 一、子執行緒向主執行緒傳值: 這個實現比較簡單,因為主執行緒自帶Looper機制,所有我們不用
java執行緒池主執行緒等待子執行緒執行完成
Java如何等待子執行緒執行結束 今天討論一個入門級的話題, 不然沒東西更新對不起空間和域名~~ 工作總往往會遇到非同步去執行某段邏輯, 然後先處理其他事情, 處理完後再把那段邏輯的處理結果進行彙總的產景, 這時候就需要使用執行緒了. 一個執行緒啟動之後, 是非同
Qt中QThread執行緒與主執行緒的資料傳送以及lineEdit的顯示
最近因為專案的需要,需要qt與C語言的程序間通訊,這裡表示Qt為A程序,C語言為B程序。 這裡採用管道通訊。 A程序的執行緒讀取管道,B程序寫入管道。 A執行緒讀到char 字元陣列中,然後再主執行緒中lineEdit顯示。 遇到一個char 和QString的相互轉換 這
子執行緒向主執行緒傳遞訊息
package com.example.day19_handler_demo1; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.a