当前位置: 代码迷 >> java >> 线程并发文件修改
  详细解决方案

线程并发文件修改

热度:84   发布时间:2023-08-02 11:20:56.0

我今天才开始学习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
}}

我认为这根本不是scala问题。

您可以在启动线程之前创建FileWriter ,但是在首次写入后将其关闭:

fw.write(((p1|p2)|(p3|p4)).toString)
fw.close()

因此,如果您确保仅在最后一个线程完成后才关闭FileWriter 您应该走得更远。 虽然,而不是使用线程,您可能想看看Akka。

  相关解决方案