Scala线程run方法外代码执行时机及Future封装问题
问题解答
1. run方法外部的条件判断代码何时执行?
你写的这段代码里,run()方法之外的所有代码(包括那个if(xyz)的分支判断、var running = false的变量初始化、halt()方法的定义),都是在创建myThread这个线程对象的当前线程里执行的——说白了就是在你执行val myThread = new Thread() { ... }这行代码的瞬间,这些逻辑就已经跑完了,和后面调用myThread.start()启动新线程完全是两回事。启动新线程只会触发run()方法的执行,不会再去跑外面的条件判断。
举个实际场景:如果当前是主线程在创建myThread,那这个if-else就是主线程执行的,等你调用myThread.start()时,新线程才会去跑run()里的循环逻辑。
2. 能否将整个线程逻辑封装为Future?
完全可以,但要适配原代码的“循环执行+可停止”逻辑,这里给你个简单的实现思路:
import scala.concurrent.{Future, Promise} import scala.concurrent.ExecutionContext.Implicits.global import scala.util.control.NonFatal import scala.concurrent.blocking def createControlledTask(xyz: Boolean): (Future[Unit], () => Unit) = { // 先执行原代码里的if-else逻辑(和创建Thread时一样,在当前线程执行) if (xyz) { // 原代码里的do this逻辑 } else { // 原代码里的do something else逻辑 } val stopPromise = Promise[Unit]() val taskFuture = Future { try { while (!stopPromise.isCompleted) { // 原代码里call a function的逻辑 blocking { Thread.sleep(10000) } } } catch { case NonFatal(e) => stopPromise.failure(e) } } // 返回Future和停止函数(对应原有的halt方法) (taskFuture, () => stopPromise.success(())) } // 使用示例 val (myTask, haltTask) = createControlledTask(true) // 要停止任务时调用haltTask() // haltTask()
这个实现里:
- 原代码的if-else逻辑同样在创建任务的当前线程执行,和原逻辑一致
- 用
Promise来实现类似running变量的停止控制,调用返回的haltTask()就可以终止循环 - 把
Thread.sleep包裹在blocking中,让线程池能更好地管理阻塞任务
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

