java线程Thread启动和结束线程

本文详细介绍了Java中如何创建并启动Thread线程,以及如何优雅地结束线程。通过示例代码展示了start()方法的使用,强调了不能直接调用run()来启动线程。同时,讨论了Thread的join()方法和interrupt()方法在结束线程时的作用,帮助读者理解线程同步和控制的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录笔记

//重写run方法,继承Runnable
public class MissionThread implements Runnable {
@Override
    public void run() {
        Date currentDate = new Date();
        Mission mission = missionService.findMissionById(missionId);
       
            //线程休眠时间,休眠后线程启动,任务开始,将状态改变为进行中
            long sleepTime = missionStartTime.getTime() - currentDate.getTime();
            try {
                Thread.sleep(sleepTime);
                mission.setMissionStatus(MISSION_STATUS_START);
                //接单状态改成可接单
                mission.setMissionUserStatus(MISSION_STATUS);
                int updated = missionService.createOrUpdateMission(mission);
                //第二次休眠,到任务结束时间,将任务状态改为已经结束
                sleepTime = missionEndTime.getTime() - missionStartTime.getTime();
                Thread.sleep(sleepTime);
                mission.setMissionStatus(MISSION_STATUS_END);
                //接单状态改成不能接单
                mission.setMissionUserStatus(MISSION_STATUS_DEFAULT);
                updated = missionService.createOrUpdateMission(mission);
            } catch (InterruptedException e) {
                log.warn(missionId+mission.getMissionName()+":我的线程已经被主人在"+new Date()+"中断了!");
                //e.printStackTrace();
            }
    }
}

//执行线程
Thread thread = new Thread(new MissionThread(missionService, mission.getMissionStartTime(), mission.getMissionEndTime(), missionId));
                thread.setName("mission"+missionId);
                thread.start();
                log.warn("mission线程中:"+missionId+"开始启动咯");


//中断线程
public ServiceResult stop(String missionId){
        Mission mission = missionService.findMissionById(missionId);
        mission.setMissionStatus(MISSION_STATUS_DEFAULT);
        missionService.createOrUpdateMission(mission);
        String threadName = "mission"+missionId;
        ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();
        int threadNum= threadGroup .activeCount();
        Thread[] threadList = new Thread[threadNum];
        threadGroup .enumerate(threadList);
        for(int i = 0;i < threadNum;i++){
            if(threadList[i].getName().equals(threadName)){
                threadList[i].interrupt();//不建议使用stop
                log.warn(new Date()+"====停止任务ID为"+threadList[i].getName()+"的线程");
                return ServiceResult.success("取消成功");
            }
        }
        return ServiceResult.success("取消失败");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值