小编Jac*_*_Du的帖子

Java中一个线程池的核心线程为什么不能在初始阶段复用?

最近看ThreadPoolExecutor的源码有个疑问:如果线程池代表重用已有线程来减少线程创建或销毁的开销,那为什么不在初始阶段重用核心线程呢?即当当前线程数小于核心线程数时,首先检查是否有核心线程完成了任务,如果有,重用。为什么不?而不是在达到核心线程数之前创建新线程,这是否违反了线程池设计原则?

下面是对ThreadPoolExecutor中addWorker()方法的部分注释

  • @param firstTask 新线程应该首先运行的任务(如果没有,则为 null)。当线程少于 corePoolSize 时(在这种情况下我们总是启动一个),或者当队列已满(在这种情况下我们必须绕过队列)时,使用初始的第一个任务(在方法 execute() 中)创建工人. 最初空闲线程通常通过 prestartCoreThread 创建或替换其他垂死的工人。

java multithreading

5
推荐指数
1
解决办法
178
查看次数

mutableStateof 和 livedata&viewmodel 有什么区别?

我是 Android Jetpack Compose 的新手。我想使用可观察的数据,当数据发生变化时,用户界面会自动更新。我遇到的解决方案有两种:

  1. 可变状态
@Composable
fun test(){
   var list = mutableStateListOf<String>();
   LazyColumn(
            modifier = Modifier
                .fillMaxSize()
                .background(Color(0xDE, 0xDE, 0xDE, 0xFF))
                .clickable(onClick = {
                   //when i click the whole list, it delete the last element of list, and then automatically update view
                   list.removeLast()
            }),
            verticalArrangement = Arrangement.spacedBy(10.dp)
        ) {
            items(list) {
                Text(text = it)
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

2.LiveData&viewModel

class TermModel : ViewModel() {
   
    private val termList = mutableStateListOf<Term>()
    private val termListLiveData: MutableLiveData<List<Term>> = MutableLiveData()
    
    fun removeLast(){
     //omit removing logic …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose

1
推荐指数
1
解决办法
609
查看次数