问题描述
我今天才开始学习Scala,所以这可能是一个非常简单的问题。
我试图从多个线程写入文件,但是我只从第一个线程得到结果。
我已经阅读了很多关于Futures
但是找不到有效的实现(很可能是因为我不了解某些东西)。
有人可以解释一下如何让多个线程写入同一个文件吗?
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.collection.mutable.ListBuffer
import util.Random.nextInt
import java.io.IOException
import java.io.FileWriter;
object HelloWorld {
def main(args: Array[String]) {
val p1=1<<56
val p2=7<<52
val p3=0<<32
val r = scala.util.Random
val fw = new FileWriter("steam_out_scala.txt", true)
for (i <- 0 to 3) {
val thread = new Thread {
override def run {
val p4=r.nextInt(1000000)
val url=("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=XXXYYYZZZ,steamids="+((p1|p2)|(p3|p4))).toString
try{
val in = scala.io.Source.fromURL(url.toString,"utf-8")
fw.write(((p1|p2)|(p3|p4)).toString)
//fw.close()
}
catch{
case e: IOException => { //catches api call fail AND file write failed
println("failed for num: "+(((p1|p2)|(p3|p4)).toString))
}
}
}
}
thread.start
//Thread.sleep(50)
}
fw.close() //moved here
}}
1楼
我认为这根本不是scala问题。
您可以在启动线程之前创建FileWriter
,但是在首次写入后将其关闭:
fw.write(((p1|p2)|(p3|p4)).toString)
fw.close()
因此,如果您确保仅在最后一个线程完成后才关闭FileWriter
。
您应该走得更远。
虽然,而不是使用线程,您可能想看看Akka。