漂在北京之走入昌平(一)

依然记得,那一年是2000
七月的北京,热情如火
珠市口,对于初到北京的我,本没有什么印象,却在那一天深深的刻在了我的心底

骑着刚买的自行车,刚转过那条繁华的大街,一位警察便拦住了我,查证件,于是身份证,学历证都给了他,他看后,什么也没说,便把我带到了位于珠市口的派出所,那里聚集了好多人,我一时还闹不清是怎么回事,只是隐隐从嘈杂的话语声中明白了事情的大概。心里忽然有一种不安,想起了常被提起的一个词“收容”,心想不会这种事也落到了自己头上吧。

我试着去跟警察沟通,但每次都被挡了回来,我有些后悔,为什么来北京不马上弄一个暂住证,但随后的一幕场景却又让我释然了,一个年轻人拿着手中的暂住证给那位警察,说:我有暂住证,那位警察拿过来看了看,随手就把他撕了,说:还有吗?那个年轻人嘴张着大大的,却什么也说不出来。我不知道那个年轻人的暂住证是否过期,但警察的态度却让我吃惊。

随着时间的推移,我的心也渐渐的落到了沉处,心里明白,自己确实是走入了一条死胡同,黄昏时分,我和周边的不知名不知姓的几十个人,一起被送上了一辆豪华大巴,我不知道会被送到哪里,但肯定的知道,这个地方肯定不是什么好地方。

车出了城,我分不清东南西北,只知道走了好久,车在一个满是电网的围墙边停了下来,走入那扇围墙,我忽然想起我所看过的一部电影“监狱风云”,情景还是蛮像的,铁栏杆,上下两层,然后就是铁栏杆后的人,乌呀呀的一片,男男女女,老老少少。

天空不知何时下起了雨,漓漓沥沥的,不大,却像是我当前的心绪,扯也扯不断。

站在栏杆后,我的大脑有些空白,脚下漫无目的的在屋子里走来走去。

忽然,一个声音传来,“你是哪的”,我抬头看了看他,屋里有一铺通炕,他坐在炕头,整个屋子只有他那有几床被子,还有水,方便面。看样是个铺头之类的,这是我在电影中看过的,没想到居然在现实中也真是这样。

 

“东北的”,我答到,他点了点头,回头对周边的人大喊了一声,“都给我起来,空个地方”,于是,一幕让我想像不到的事发生了,炕上趟着的二三十人,居然全都坐了起来,转瞬之间,在拥挤的炕铺中便空出了一小片地方,他对着我说:“你晚上就趟在这吧”,然后,又指着他的那些食物说:“饿了这有吃的,水,十元一瓶,干脆面十元一包,烟,二元一根”,我点点头,说“好,谢谢你,但现在我不饿”,径自走到空出的地方躺了下来,虽然从中午开始就没有吃东西,但却实在也没有什么胃口,何况那么贵,“这不是在抢钱吗?”,我在心里暗暗说,事后,才知道,在这里确实是有抢钱的,让你买东西其实是已经很不错了,我猜测,可能跟我是东北人有关,因为那个炕铺“大哥”也是东北的。

栏外的雨依旧没有停,也依旧不断的有人被送了进来,嘈杂的声音时时在耳边响起,但我却已无心去关注这些,一天的疲惫侵绕着我,注定了这一夜,我在雨中独眠。

 

第二天的清晨来的似乎比往常早,当我醒来的时候,天已经亮了,我没有表,也没有手机,不知道是几点,我看了看四周,栏边,过道,站满了人,这一夜,他们应该就是站着过来的,相对而言,我还是幸运的,起码还有个地方躺着,我这样安慰自己,即来之,则安之,不然又怎么样呢

我站起身,四处开始溜达,开始寻找老乡。没多久,就让我找到了两个,其中一个还居然是军人,问起他的经历,他的怨言明显还没有消除,他是哈尔滨人,这次来北京是看望战友的,到战友那把东西扔下,然后穿了个拖鞋出来买东西,结果就被弄进来了,此时,战友还不知道呢。他摇摇头,满是无奈的表情,另一个岁数则看起来小的多,吉林胶河市人,在北京打工,查证件的事他经历很多,不过这次不走运,正好没带,我们一边聊,一边同四周的人打听,究竟什么时候可以出去?但打听到的结果却让我们隐隐有不安的感觉,能不能早点回去是跟所在的户口所在地有关的,河北因为离得近,几乎天天都有当地的公安机关来领人,而远的则没有那么幸运,在边上躺着的一位藏族同胞居然已经在这里呆了半年了。问其原因,才知道来领人的条件是要凑满一个列车组,否则,就只能等了。我们互相望了一眼,没有说话,但意思大家却都明白,乖乖,如果一辈子凑不足人,难道要在这里呆一辈子吗?

 

<think>我们计划创建个控制台应用程序,其中启动个新线程来循环打印“我在努力学习”十次。当该线程完成时,我们执行延续操作,打印“我可以走入职场出关施展拳脚啦”。 在C#中,我们可以使用Thread类来创建线程,但是为了在线程结束时执行延续操作,我们可以使用线程的Join方法等待线程结束,然后在Join之后执行延续操作。但是这样会阻塞主线程。另种方式是使用线程池(ThreadPool)或任务(Task),它们更支持延续操作。考虑到用户要求使用线程,我们可以用Thread,然后通过其他方式通知延续(比如在子线程的最后直接调用延续方法,或者使用事件等)。但是,为了更符合现代C#编程,我们也可以使用Task来简化,因为Task内部也是基于线程池的,而且支持延续。不过用户明确要求“线程”,所以我们这里使用Thread类,并在线程结束时触发延续。 然而,题目要求是“创建多线程控制台程序”,并没有限定定要用Thread类,而且Task也是基于线程的,更简单。但为了严格满足要求,我们使用Thread类。 思路: 1. 创建个新线程,在该线程中循环打印10次“我在努力学习”。 2. 在该线程的方法中,循环结束后,我们可以直接调用个方法(延续操作),但这样延续操作会在子线程中执行。 3. 或者,我们可以在主线程中等待子线程结束,然后执行延续操作(使用Join),但这样主线程会被阻塞。 另种更优雅的方式是使用回调:我们在创建线程时传入个回调方法,当线程结束时调用这个回调。 但是,Thread类本身并不直接支持回调。我们可以自己实现:在线程函数结束时调用回调。 因此,我们这样设计: - 定义个线程函数,该函数接收个回调委托(Action)作为参数。 - 在线程函数中执行循环打印,循环结束后调用传入的回调。 但是,Thread的ParameterizedThreadStart只能接受个object类型的参数。我们可以使用lambda表达式来捕获回调。 或者,我们可以使用ThreadStart委托,然后在lambda表达式中封装我们的逻辑和回调。 步骤: 1. 创建线程,使用ThreadStart委托,但实际上我们使用lambda表达式来定义线程的执行体。 2. 在lambda表达式中,我们执行循环打印10次,然后执行延续操作(打印结束语句)。 但是这样延续操作就写死在线程方法里了。为了解耦,我们可以将延续操作作为参数传递。 我们可以这样做: 方法1:使用lambda表达式捕获外部变量(这里是个委托) Action onCompleted = () => Console.WriteLine("我可以走入职场出关施展拳脚啦"); Thread thread = new Thread(() => { for (int i = 0; i < 10; i++) { Console.WriteLine("我在努力学习"); // 为了看到效果,每次打印后暂停下 Thread.Sleep(100); } onCompleted(); // 在线程结束时调用延续操作 }); 方法2:或者单独写个方法,接受个Action作为参数,然后在新线程中执行。 我们使用方法1,因为它简单直接。 注意:控制台程序的主线程需要等待子线程结束吗?如果不等待,主线程结束会导致整个程序结束。因此,我们让主线程等待子线程完成。但是,由于我们的延续操作在子线程中调用,所以主线程等待子线程结束即可。我们可以使用thread.Join()。 然而,如果使用thread.Join(),那么主线程就会阻塞直到子线程完成。这样延续操作在子线程中执行,然后主线程才结束。 所以,程序结构如下: - 主方法中创建线程并启动 - 然后主线程调用Join等待子线程结束 - 这样控制台程序不会提前退出 但是,延续操作已经在子线程中执行了,所以不需要主线程再做什么。 另种做法:延续操作放在主线程中执行,那么我们可以: 子线程执行完循环后,通过某种方式通知主线程(比如设置个标志),然后主线程检测到这个标志后执行延续操作。但这样主线程需要轮询,不好。 或者使用事件、信号量等同步机制,但这样复杂了。 考虑到简单性,我们让延续操作在子线程中执行。 因此,代码如下: 注意:由于控制台应用程序可能立即退出,所以主线程需要等待子线程完成。我们使用Join。 代码实现: 我们将使用以下步骤: 1. 创建并启动线程。 2. 主线程等待该线程完成(使用Join)。 3. 这样确保控制台在子线程完成之前不会关闭。 但是,延续操作已经在子线程中执行了,所以当Join返回时,延续操作已经完成。 另种做法:不使用Join,而是让主线程等待用户输入,但这样不够自动化。 我们选择使用Join。 代码:</think>以下是个使用C#创建多线程控制台程序的实现方案,满足在子线程循环打印消息并在结束时执行延续操作的需求: ```csharp using System; using System.Threading; class Program { static void Main() { // 创建线程并指定执行方法 Thread studyThread = new Thread(StudyRoutine); // 启动线程 studyThread.Start(); // 主线程等待子线程完成 studyThread.Join(); Console.WriteLine("主线程结束"); } static void StudyRoutine() { try { // 循环打印学习消息 for (int i = 0; i < 10; i++) { Console.WriteLine("我在努力学习"); Thread.Sleep(300); // 模拟工作耗时 } } finally { // 线程结束时的延续操作 Console.WriteLine("我可以走入职场出关施展拳脚啦"); } } } ``` ### 关键点说明: 1. **线程创建**: - 使用 `Thread studyThread = new Thread(StudyRoutine)` 创建新线程 - `StudyRoutine` 是线程的执行方法 2. **线程任务**: - `for` 循环打印10次 "我在努力学习" - `Thread.Sleep(300)` 模拟任务耗时(实际使用时可根据需要调整) 3. **延续操作**: - 使用 `try-finally` 结构确保线程结束时必然执行延续操作 - 在 `finally` 块中打印 "我可以走入职场出关施展拳脚啦" 4. **线程同步**: - `studyThread.Join()` 使主线程等待子线程完成 - 避免主线程提前退出导致程序终止 ### 执行结果: ``` 我在努力学习 我在努力学习 ...(重复10次)... 我可以走入职场出关施展拳脚啦 主线程结束 ``` ### 注意事项: 1. 线程调度由操作系统管理,实际执行顺序可能有微小波动[^2] 2. 对于复杂场景推荐使用 `Task` 代替 `Thread`(支持更强大的延续操作) 3. 实际开发中应考虑线程同步和资源竞争问题[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值