1. 程式人生 > >守護執行緒保證主執行緒不斷掉

守護執行緒保證主執行緒不斷掉

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