IllegalThreadStateException解决
来源:互联网 发布:lightroom mac版下载 编辑:程序博客网 时间:2024/05/16 10:58
IllegalThreadStateException
出错部分的源码:
package thread;import java.util.Map;import org.apache.log4j.Logger;import com.pyc.redis.RedisClient;import com.pyc.redis.RedisKeyEnum;import com.pyc.service.PbbService;public class HdidThread extends Thread { private static Logger logger = Logger.getLogger(HdidThread.class); private static HdidThread pbbThread; private PbbService pbbService; private HdidThread(PbbService pbbService) { this.pbbService = pbbService; } private HdidThread() {} public static HdidThread getInstance(PbbService pbbService) { if (pbbThread == null) { synchronized (HdidThread.class) { if (pbbThread == null) { pbbThread = new HdidThread(pbbService); } } } return pbbThread; } @Override public void run() { logger.info("hdid缓存开始。。。。。。。"); Map<String, String> recentHdidAndKeywords = this.pbbService.queryRecentHdidAndKeywords(); RedisClient.hsetAll(RedisKeyEnum.HDIDKEYWORDS.toString(), recentHdidAndKeywords); logger.info("hdid缓存结束。hdid个数:"+recentHdidAndKeywords.size()); }}
我想在程序执行时,如果发现缓存是空的,就把常用的数据放入缓存,这个过程比较慢。所以需要一个线程单独执行,不影响主线程的执行。对这个线程的要求是,如果线程还没有执行完,不会启动新的线程。用户请求时如果缓存中没有,线程会再次执行(缓存可能会在别的地方清空)。
错误的原因是:我的程序中写了单例,也就是只会有一个线程对象。这个对象启动一次后,如果再被启动就会报上面的错误。
我写单例是想控制程序不会重复启动,这样写达不到目的,逻辑上也是不对的。
解决方法:线程运行过程中不要启动新的线程,设置一个标志,标志程序是否正在执行。
新的代码:
启动线程的代码:
//-------启动一个线程将活跃用户放入缓存----------HdidThread pbbThread = new HdidThread(this);if (!RedisClient.exists(RedisKeyEnum.HDIDKEYWORDS.toString())) { pbbThread.start();}
线程:
package thread;import java.util.Map;import org.apache.log4j.Logger;import com.pyc.redis.RedisClient;import com.pyc.redis.RedisKeyEnum;import com.pyc.service.PbbService;public class HdidThread extends Thread { private static Logger logger = Logger.getLogger(HdidThread.class); private static boolean isRunning; private PbbService pbbService; public HdidThread(PbbService pbbService) { this.pbbService = pbbService; } @Override public void run() { if (!isRunning) { synchronized (HdidThread.class) { if (!isRunning) { isRunning = true; logger.info("hdid缓存开始。。。。。。。"); Map<String, String> recentHdidAndKeywords = this.pbbService.queryRecentHdidAndKeywords(); RedisClient.hsetAll(RedisKeyEnum.HDIDKEYWORDS.toString(), recentHdidAndKeywords); logger.info("hdid缓存结束。hdid个数:"+recentHdidAndKeywords.size()); isRunning = false; } } } }}
参考:https://www.cnblogs.com/winAlaugh/p/5473407.html
阅读全文
0 0
- IllegalThreadStateException解决
- IllegalThreadStateException: Thread already started解决
- 解决 java.lang.IllegalThreadStateException: Thread already started. 错误
- Thread问题:解决 java.lang.IllegalThreadStateException: Thread already started. 错误
- 解决 java.lang.IllegalThreadStateException: Thread already started. 错误
- IllegalThreadStateException异常
- java.lang.IllegalThreadStateException翻译
- java.lang.IllegalThreadStateException
- java.lang.IllegalThreadStateException异常
- java.lang.IllegalThreadStateException问题解决
- java.lang.IllegalThreadStateException
- java.lang.IllegalThreadStateException
- java.lang.IllegalThreadStateException异常
- java.lang.IllegalThreadStateException异常分析
- java.lang.IllegalThreadStateException异常原因解析
- java.lang.IllegalThreadStateException 线程运行报错
- Exception in thread "main" java.lang.IllegalThreadStateException
- java.lang.IllegalThreadStateException异常原因解析
- 青春路上,岁月如烟
- JSP基础语法(一)
- Effective Java中文第五章第23节(个人渣翻)
- Python新手写出漂亮的爬虫代码2——从json获取信息
- HTMl5的sessionStorage和localStorage
- IllegalThreadStateException解决
- TensorBoard Histogram Dashboard
- 文件操作相关
- 安卓自定义View教程目录
- LeetCode442. Find All Duplicates in an Array解题
- React-native 学习之Confirm弹出框
- meterpreter解释器-进程迁移
- HTTP基础之Cookie
- Digit Puzzle UVA