Tag: 多线程

即使UI线程似乎响应,标签文本也不会更新

我正在使用JDK 8u121上的Kotlin 1.1.51构建TornadoFX 1.7.11的应用程序。 我试图在一个单独的线程中执行长时间运行的任务,并使用进度条和标签在UI中显示进度。 奇怪的是,标签没有更新。 我认为,也许我以某种方式在UI线程上运行的任务,它卡住了,但进度条工作和用户界面是否响应(控制工作等)。 我也尝试用ScenicView手动编辑标签,它工作。 我没有想法,你们能帮忙吗? 这里有一些简化的代码片段: MainView.kt class MainView : View("") { private val controller: MainController by inject() override val root = borderpane { bottom(TasksView::class) } init { controller.reloadTranslations().completed.onChange { // do some lightweight UI stuff } } } MainController.kt class MainController : Controller() { private val tasksController: TasksController by inject() […]

Kotlin:如何将使用Thread.sleep的测试转换为RxJava TestScheduler

我正在写一个工具测试,它检查是否当我缓存东西到一个接收缓冲区,并经过一段时间(10秒)这个主题插入缓冲值到我的房间数据库。 当我使用Thread.sleep(syncTimeInterval)时,测试是正确的。 我想用TestScheduler编写这个相同的测试。 这里是Thread.sleep版本(通过测试): @Test fun testMultipleLogs() { val loadAllCloudCallBefore = appDatabase.logCloudCallDao().loadAll() val loadAllLogNewSessionBefore = appDatabase.logNewSessionDao().loadAll() assertEquals(0, loadAllCloudCallBefore.size) assertEquals(0, loadAllLogNewSessionBefore.size) Observable.interval(1, TimeUnit.SECONDS) .take(20) .subscribe { logManager.logNewSession() } Observable.interval(1, TimeUnit.SECONDS) .take(20) .subscribe { logManager.logCloudCall("url", "callgoup") } Observable.interval(1, TimeUnit.SECONDS) .take(20) .subscribe { logManager.logNewSession() } Observable.interval(1, TimeUnit.SECONDS) .take(20) .subscribe { logManager.logCloudCall("url", "callgoup") } Observable.interval(1, TimeUnit.SECONDS) .take(20) .subscribe { […]

Kotlin中的多线程数组初始化

说,我有以下功能,让我创建矩阵: inline fun <reified T> Matrix2D(w: Int, h: Int, init: (Int, Int) -> T) = Array(w){ x -> Array(h){ y -> init(x, y) } } inline fun <reified T> Matrix2D(w: Int, h: Int, value: T) = Array(w){ Array(h){ value } } // For example: val m = Matrix2D(400, 400) { x, y -> Color(x.toDouble() / […]

Android – Kotlin:异步乐趣中的返回值

我想问一下,如果函数做AsyncTask,是否有可能从函数中“返回”一个值? 例如 : fun readData() : Int{ val num = 1; doAsync { for (item in 1..1000000){ num += 1; } } return num; } 这个函数的问题是AsyncTask还没有完成,所以我从函数中得到一个错误的值,任何想法如何解决它? 是使用一个接口是唯一的原因或有像Swift一样的编译处理程序?

thead.join查杀正在运行的线程java(kotlin)

我有一个托管对象(Dropwizard),它正在处理内存中的队列。 关闭信号发送时,我需要处理队列的结束。 当我设置关闭信号为真,而不加入线程,我可以看到如果我把睡眠在我的测试项目处理。 但是,当我加入线程似乎停止线程死亡,而不是等待运行方法完成。 class LedgerProcessor constructor( private val ledgerProcessorQueue: LedgerProcessorQueue, private val paymentDao: PaymentDao) : Managed { private lateinit var pollingThread: Thread private val shuttingDown: AtomicBoolean = AtomicBoolean(false) override fun start() { log.info { "Started Processing ledger requests" } pollingThread = object : Thread() { override fun run() { while (checkStatus()) { val payment […]

JavaFx / Kotlin中的多线程图像呈现

我试图尽可能快地使用所有的CPU核心来填充图像(使用JavaFx),但是我遇到了一些问题。 下面是我可以想出的最小的例子,重现了这个问题。 当我用launch函数创建的Job上调用join()时,图像渲染正确,但显然只使用一个CPU内核? 这是为什么? 另一方面,当我没有在返回的作业上调用join()时,所有的CPU核心都被利用了,但是显然,图像渲染是不正确的,因为父方法不会等待作业完成: 任何方式,我可以填补所有内核,仍然看起来是正确的? package com.serious.business import javafx.animation.AnimationTimer import javafx.application.Application import javafx.scene.Scene import javafx.scene.canvas.Canvas import javafx.scene.image.WritableImage import javafx.scene.layout.Pane import javafx.stage.Stage import kotlinx.coroutines.experimental.CommonPool import kotlinx.coroutines.experimental.launch import kotlinx.coroutines.experimental.runBlocking class ImageTestApp: Application() { val w = 800.0 val h = 800.0 val image = WritableImage(w.toInt(), h.toInt()) var blue: Double = 0.0 override fun start(primaryStage: Stage) { […]

Kotlin局部变量线程安全

所以我正在编写一个单元测试来测试一些多线程,我想知道这个代码是否能保证按照我的预期工作。 fun testNumbers() { var firstNumber: Int? = null var secondNumber: Int? = null val startLatch = CountDownLatch(2) val exec = Executors.newFixedThreadPool(2) exec.submit({ startLatch.countDown() startLatch.await() firstNumber = StuffDoer.makeNumber() }) exec.submit({ startLatch.countDown() startLatch.await() secondNumber = StuffDoer().makeNumber() }) while (firstNumber == null || secondNumber == null) { Thread.sleep(1) } } 具体来说,这个方法是否保证完成? firstNumber和secondNumber不是volatile那么这意味着exec线程中的那些值中设置的结果可能永远不会被运行测试的线程看到? 你不能将volatile应用到局部变量,所以实际上,如果可能有必要的话,你不能使函数局部变量变得不稳定。 (我把Java作为标签添加,因为大概Java的基本问题是相同的。)

Kotlin:阻塞具有非阻塞I / O的协程

我正在尝试使用Kotlin协同处理非阻塞I / O。 情景如下: 从线程1上运行的异步回调接收数据。 等待线程2中的这些数据,然后将其消耗。 我现在的代码看起来像这样(为简洁起见而简化): private var latch = CountDownLatch(1) private var data: Any? = null // Async callback from non-blocking I/O fun onReceive(data: Any) { currentData = data latch.countDown() } // Wait and consume data fun getData(): Any? { latch.await() latch = CountDownLatch(1) return currentData } fun processData() { launch(CommonPool) { while […]

Java vs Kotlin – 同一个类中的Spring @Async方法

我发现在Java中,当您尝试从同一个类中调用@Async方法时,您实际上在同一个线程中运行方法,但是在Kotlin中它以异步方式运行。 看起来像代理包装工作不同。 例: @Service class BasicService { @Scheduled(fixedRate = 1000) fun asyncCall() { log.info("Async call") doAsync() } @Async("myAsyncExecutor") open fun doAsync() { log.info("DO ASYNC AND SLEEP. Thread: ${Thread.currentThread().name}") Thread.sleep(7000) log.info("Finsh async call") } … } 当您使用Kotlin doAsync()通过myAsyncExecutor异步运行时, myAsyncExecutor在Java中运行在相同的线程上,并且调度器将每7秒等待一次,然后再次启动。 那么科特林如何解决这个问题呢?

将Java线程转换为Kotlin

我尝试通过书“通过示例的Android游戏编程”来学习Kotlin。 现在我无法进一步创建线程。 在Java中,一个线程首先被定义为零,后来被sleep()延迟。 由于我还是一个新手,我无法根据自己的需要定制代码。 这就是我在Kotlin中找到线索的解释。 但是我不能付诸实践。 有人可以告诉我如何使用我的例子做到这一点? 我删除了线程的代码行。 public class TDView extends SurfaceView implements Runnable { //Thread related volatile boolean playing; Thread gameThread = null; //Line 29 … private void control() { try { gameThread.sleep(17); //Line 310 } catch (InterruptedException e) { //catch things here } } public void pause() { playing = false; try […]