Tag: 并发

线程未按顺序依次运行

我期望输出为0 0 1 1 2 2 …但是输出是0 1 2 3 … 0 1 2 3 class Runner: Thread() { override fun run() { var i = 0 while (i < 10) { println("${Thread.currentThread().name} $i") i++ } try { Thread.sleep(100) } catch (e: Exception) { e.printStackTrace() } } } fun main(args: Array<String>) { val nah = […]

Quasar和Comsat是否值得取代Ktor?

我希望这个问题值得回答和问好! 我有几个使用Ktor的项目。 我已经研究过Quasar,我知道Comsat有Web后端。 如你所知,Ktor使用光纤和NIO! 有了这个通知,用Quasar(Comsat)重写项目是否使它们比Ktor更好(明显)好?

Nim:具有变异状态的并行循环

我是Nim语言的新手。 我想通过实现一个简单的遗传算法来演变字符串(整数atm),通过将工作分配给CPU核心来学习: https://github.com/peheje/nim_genetic 我已经成功地并行化了“代理”的创建,但是却无法调用必须改变传入状态的函数“生命”: … type Agent* = ref object data*: seq[int] fitness*: float … var pool: seq[Agent] = newAgentsParallel(POPULATION_SIZE) # Run generations for gen in 0..<N_GENERATIONS: let wheel = createWheel(pool) let partitions: seq[seq[Agent]] = partition(pool, N_THREADS) parallel: for part in partitions: echo "spawning" spawn life(part, pool, wheel) pool = createPool(pool, wheel) … proc life(part: […]

创建一个SingleBlockingQueue同步器

我试图创建一个SingleBlockingQueue<T>同步器,允许一个线程offer()一个元素给它,另一个线程将take()它。 在SingleBlockingQueue<T>中一次只保留一个T元素,如果前一个元素正在等待take线程take() ,则推送线程在offer()上被阻塞。 推送线程将继续推送项目,直到它调用setComplete() ,并且当isComplete()为false时,take线程将继续调用take() 。 如果正在等待某个元素,则线程将被阻塞。 这是我迄今为止的同步器。 import java.util.concurrent.atomic.AtomicBoolean; public final class SingleBlockingQueue<T> { private volatile T value; private final AtomicBoolean isComplete = new AtomicBoolean(false); private final AtomicBoolean isPresent = new AtomicBoolean(false); public void offer(T value) throws InterruptedException { while (isPresent.get()) { this.wait(); } this.value = value; synchronized(this) { this.notifyAll(); } } public boolean […]

为什么Kotlin中没有并发关键字?

我只是潜入这个惊人的语言,这一件事情令我感到沮丧。 为什么没有同步的关键字? 到目前为止,我的研究放弃了一个解决方案,你包装一些高层次的类,并使用它们来处理并发… 给定一个关于纯kotlin的项目,如果需要处理并发性的小型高度优化组件,我们应该做些什么…我的印象是kotlin是java的一种辅助语言,在kotlin中编写90%的代码,但是一些不可能用kotlin表示的java代码。 这是正确的吗? 这是它的目的是什么?

在Java / Kotlin的ThreadPool中取消被取代的任务

我试图找出如何取消一个任务在一个ThreadPool如果一个新的任务来取代它。 我有一些类似这样的: class RenderableThing { private val lock = ReentrantLock() fun lock(interrupt: Boolean) { if (lock.isLocked && interrupt) { // How do I interrupt the thread that has the lock? } lock.lock() } fun unlock() = lock.unlock() fun cache() = Cached() inner class Cached() } class BackgroundStuff(threads: Int) { val pool = Executors.newFixedThreadPool(threads)!! fun doBackgroundStuff(thing: […]

CountDownLatch没有释放线程

我有一个方法,从Firebase存储加载图像。 它被称为后台线程,我需要阻止它,直到图像加载(以避免回调地狱)。 这里是代码(在Kotlin) override fun fromNet(): Bitmap? { Log.wtf(TAG, "$name loading from firebase") var result: Bitmap? = null val lock = CountDownLatch(1) try { FirebaseStorage.getInstance().getReferenceFromUrl(FIRE_STORAGE).child(ctx.getKGL().famkey) .child(name).getBytes(524288L) .addOnFailureListener { Log.wtf(TAG, "$name load failure") lock.countDown() } .addOnSuccessListener { bytes -> Log.wtf(TAG, "$name loaded") val b = BitmapFactory.decodeByteArray(bytes, 0, bytes.size).scale(ctx.dip(64)) result = b lock.countDown() ctx.saveToCache(name, b) } .addOnCompleteListener […]

Kotlin同步

我在过去几周一直在研究java多线程。 我了解了同步,并了解同步避免各个线程同时访问相同的属性。 我写了这个代码在同一个线程上运行两个线程。 val gate = CyclicBarrier(3) val obj = SynchronizedCounter() var nah = object : Thread() { override fun run() { gate.await() obj.increment() } } var blah = object : Thread() { override fun run() { gate.await() println(obj.value()) } } nah.start() blah.start() gate.await() class SynchronizedCounter { private var c = 0 @Synchronized fun increment() […]

Kotlin可以替代Python的协同产出和发送

什么是一个Kotlin惯用的替代下面的Python协程代码片段: def generator(): c = 1 while True: op = yield c if op == 'inc': c += 1 elif op == 'mult': c *= 2 # main g = generator() a = g.send(None) # start b = g.send('inc') c = g.send('mult') d = g.send('inc') print([a, b, c, d]) # 1, 2, 4, 5 所以我需要从协程(通过通道?)获取值,而且还要将值发送回协程。 […]