java 注意线程下的 异常捕获,会跳过sleep(10000)休眠,可能会出现死循环

线程

(1)在catch(){} 中的语句要保证不会出现异常,或者catch中的语句再次捕获了异常,

   (2) 线程中try中的语句出现异常,会直接跳过try中的sleep,导致不停地循环

  (3)线程的while循环中如果不适用try catch 会导致当出现异常时,线程直接挂掉,

package com.hlzt.wx.thread;

import java.util.Date;

import net.sf.json.JSONObject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import com.hlzt.wx.model.global.WXGlobalVar;
import com.hlzt.wx.model.js_sdk.JsapiTicket;
import com.hlzt.wx.model.token.GlobalToken;
import com.hlzt.wx.util.token.GlobalAccessTokenUtils;

/**
 * 全局access_token 定时刷新类
 *
 * @author Administrator
 *
 */
public class GlobalAccessTokenThread extends Thread {
	static Logger logger = LoggerFactory
			.getLogger(GlobalAccessTokenThread.class);

	@Override
	public void run() {
		logger.info("################启动定时刷新token,刷新间隔时间为token超时时间的1/2");
		// TODO Auto-generated method stub
		refreshToken();
	}

	public void refreshToken() {

		while (true) {
			try {
				String token=GlobalAccessTokenUtils.setAndGetAccessToken();

					Thread.sleep(3600000);// 否则按半小时刷新
				    logger.info("###################"+3600000/1000+"s后重新刷新access_token");

			} catch (Exception e) {//<span style="color:#ff0000;">此处捕获异常,当<span style="font-family: Arial, Helvetica, sans-serif;">GlobalAccessTokenUtils.setAndGetAccessToken()方法出现异常,就会跳过sleep(),成为死循环</span></span>
<span style="font-family:Arial, Helvetica, sans-serif;color:#ff0000;">                                                                                               //但是当不捕获异常,即不用try catch 时,当出现异常时,此线程就会挂掉,不会再循环,所以线程中要捕获异常
</span>
				e.printStackTrace();
				// TODO Auto-generated catch block
				logger.info("###################获取access_token异常");
			}
		}
	}
}
时间: 2024-10-27 10:38:17

java 注意线程下的 异常捕获,会跳过sleep(10000)休眠,可能会出现死循环的相关文章

Java经验点滴:处理没有被捕获的异常_Java编程

文章来源:csdn 作者:enoeht 在我们的程序中并不是所有的异常都被捕获,有些是因为我们不想捕获,因为我们认为那些异常没必要捕获   而有些是我们无法捕获的,因为我们不能确定它们会在什么地方出现,例如像NullPointerException,ClassCastException,IndexOutOfBoundsException这些RuntimeException.我们也许可以在所有它们有可能发生的地方去捕获它们,但这确实是很坏的解决方案.但在有些情况下,我们又必须在一些未捕获的异常发生

java newCachedThreadPool 线程池使用在什么情况下?

问题描述 java newCachedThreadPool 线程池使用在什么情况下? newCachedThreadPool 再没有任务时会清空任务不占用资源,任务多时可以"无限制"的增加任务,那它和没线程池管理感觉区别就不大了呀--它到底应该怎么使用?

arraylist-java初学者问题 异常捕获

问题描述 java初学者问题 异常捕获 ArrayList<Integer> al = new ArrayList<>(); Scanner scanner = new Scanner(System.in); //死循环 直到输入0结束 while (true) { try { System.out.println(""请输入一个数 输入0表示结束""); //如果在此输入一个非int类型的数据 则陷入一个死循环 为何不能重新给i赋值 int

关于java.sql.SQLRecoverableException: Closed Connection异常的解决方案(转)

在项目中碰到了一个应用异常,从表象来看应用僵死.查看Weblogic状态为Running,内存无溢出,但是出现多次线程堵塞.查看Weblogic日志,发现程序出现多次Time Out. 我们知道,Weblogic会自动检测线程运行超时,当超过特点时间(默认600S),即认为此线程为堵塞线程.在日志中发现多次堵塞线程,通过查找资料,发现Weblogic在发生多次线程堵塞后,会自动把应用挂起.默认次数为15次.   是什么造成了线程堵塞呢?通过进一步分析日志,我们发现在线程堵塞之前,发生了多次jav

Android UncaughtExceptionHandler进行全局异常捕获

        在实际开发过程中,我们的APP由于各种原因,难免会有Crash现象(应用程序XXX已经停止).这样给用户一种很不友好的感觉,那么我们如何去处理这种情况呢?答案就在实现UncaughtchExceptionHanlder,复写uncaughtException()方法.         当crash发生的时候,系统会调用UncaughtchExceptionHanlder#uncaughtException().在uncaughtException()中我们可以选择收集错误信息,然

java关于线程同步的问题

问题描述 java关于线程同步的问题 package 线程.TestTeread_5; /* push和pop增加减少数组元素, 我的问题是: 为什么去掉push和pop的synchronized修饰关键词时,会报如下错误 异常: Exception in thread "Thread-0" java.lang.IllegalMonitorStateException at java.lang.Object.notify(Native Method) at 线程.TestTeread_

基于java涉及父子类的异常详解_java

java中的异常涉及到父子类的问题,可以归纳为一句话:子类的构造函数抛出的异常必须包含父类的异常,子类的方法可以选择抛出"范围小于等于"父类的异常或不抛出异常. 1. 为什么构造函数必须抛出包含父类的异常? 在<thingking in java>中有这么一段话: 异常限制:当覆盖方法时,只能抛出在基类方法的异常说明中列出的那些异常 异常限制对构造器不起作用,你会发现StormyInning的构造器可以抛出任何异常,而不必理会基类构造函数所抛出的异常.然而因为必须构造函数必

JAVA实现线程等待提示框

Java语言从其诞生到现在不过短短五年时间,却已经成为全球最热门的语言,Java程序员正成为IT业其它程序员中薪金最高的职员.这一切都应归功于Java良好的特性:简单.面向对象.分布式.平台无关性.可移植性.支持多线程等等.本文将用Java的多线程特性来实现线程等待提示框. 1 问题的提出 在Java应用程序编程中,有时需要在GUI(图形化用户界面)中处理一些占用系统资源较多,耗费时间较长的事务,例如:与数据库进行大批量数据交换.大数据量的复杂运算.远程连接服务器等等.系统在处理这些事务时,如果

Java在Linux下如何维持大量链接

Edit Java在Linux下如何维持大量链接 修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄).可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [speng@as4 ~]$ ulimit -n 1024 这表示当前用户的每个进程最多允许同时打开1