如何"优雅"地终止一个线程?

本文探讨了线程终止方法,分析了为何不应使用stop方法,并介绍了如何通过设置标志位来优雅地终止线程。

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

转载自 如何"优雅"地终止一个线程?

我们的系统肯定有些线程为了保证业务需要是要常驻后台的,一般它们不会自己终止,需要我们通过手动来终止它们。我们知道启动一个线程是start方法,自然有一个对应的终止线程的stop方法,通过stop方法可以很快速、方便地终止一个线程,我们来看看stop的源代码。



通过注解@Deprecated看出stop方法被标为废弃的方法,jdk在以后的版本中可能被移除,不建议大家使用这种API。


那为什么这么好的一个方法怎么不推荐使用,还要标注为废弃呢?


假设有这样的一个业务场景,一个线程正在处理一个复杂的业务流程,突然间线程被调用stop而意外终止,这个业务数据还有可能是一致的吗?这样是肯定会出问题的,stop会释放锁并强制终止线程,造成执行一半的线程终止,带来的后果也是可想而知的,这就是为什么jdk不推荐使用stop终止线程的方法的原因,因为它很暴力会带来数据不一致性的问题。


正因为stop方法太过暴力,所以一般不推荐使用,除非你非常清楚你自己的业务场景,用stop终止不会给你的业务带来影响。


说了这么多,那如何优雅地终止一个线程呢?看看下面的程序。



其实也不难,只需要添加一个变量,判断这个变量在某个值的时候就退出循环,这时候每个循环为一个整合不被强行终止就不会影响单个业务的执行结果。


import requests from bs4 import BeautifulSoup import os import re from urllib.parse import urljoin # 定义关键词列表 KEYWORDS = [&quot;&quot;] def sanitize_text(text): &quot;&quot;&quot;增强型文本清洗&quot;&quot;&quot; text = re.sub(r'<[^>]+>', '', text) text = re.sub(r'https?://\S+', '', text) replacements = { ' ': ' ', '&': '&', '&quot;': '&quot;', '<': '<', '>': '>' } for k, v in replacements.items(): text = text.replace(k, v) text = re.sub(r'[■◆▼©®™●【】]', '', text) text = re.sub(r'\s+', ' ', text).strip() return text def save_content(url, save_folder): &quot;&quot;&quot;安全获取并保存网页内容(增加空内容过滤)&quot;&quot;&quot; try: headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'} response = requests.get(url, headers=headers, timeout=10) response.encoding = 'utf-8' if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') main_content = soup.find(['article', 'div'], class_=re.compile(r'content|main')) clean_text = sanitize_text(main_content.get_text() if main_content else soup.get_text()) # 新增空内容过滤判断 if not clean_text.strip(): print(f'跳过空内容: {url}') return # 生成安全文件名 filename = re.sub(r'[\\/*?:&quot;<>|]', '', url.split('/')[-1])[:50] + '.txt' filepath = os.path.join(save_folder, filename) with open(filepath, 'w', encoding='utf-8') as f: f.write(clean_text) print(f'成功保存至: {filepath}') else: print(f'访问失败: {url} 状态码: {response.status_code}') except Exception as e: print(f'处理{url}时出错: {str(e)}') def main(): &quot;&quot;&quot;主程序&quot;&quot;&quot; # 设置保存路径 desktop = os.path.join(os.path.expanduser('~'), 'Desktop') folder_name = &quot;ScrapedData&quot; save_path = os.path.join(desktop, folder_name) # 创建保存目录(如果不存在) os.makedirs(save_path, exist_ok=True) # 模拟种子页面(需合法授权后替换实际目标网站) seed_url = &quot;http://www.81.cn/&quot; try: res = requests.get(seed_url, timeout=10) soup = BeautifulSoup(res.text, 'html.parser') # 提取包含关键词的链接 links = [] for a in soup.find_all('a', href=True): text = a.get_text().strip() if any(keyword in text for keyword in KEYWORDS): absolute_url = urljoin(seed_url, a['href']) links.append(absolute_url) # 去重处理 unique_links = list(set(links)) # 保存内容(建议控制频率) for link in unique_links[:10]: # 示例仅处理前5条 save_content(link, save_path) except Exception as e: print(f'程序终止: {str(e)}') if __name__ == &quot;__main__&quot;: main() 在上述代码基础上修改代码实现不同的文章存放在不同的txt中,不要放在同一个txt中,然后修改代码使保存txt的速度加快一些,请给出修改后完整的代码
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值