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

原创粉丝点击