最近看ThreadPoolExecutor的源码有个疑问:如果线程池代表重用已有线程来减少线程创建或销毁的开销,那为什么不在初始阶段重用核心线程呢?即当当前线程数小于核心线程数时,首先检查是否有核心线程完成了任务,如果有,重用。为什么不?而不是在达到核心线程数之前创建新线程,这是否违反了线程池设计原则?
下面是对ThreadPoolExecutor中addWorker()方法的部分注释
- @param firstTask 新线程应该首先运行的任务(如果没有,则为 null)。当线程少于 corePoolSize 时(在这种情况下我们总是启动一个),或者当队列已满(在这种情况下我们必须绕过队列)时,使用初始的第一个任务(在方法 execute() 中)创建工人. 最初空闲线程通常通过 prestartCoreThread 创建或替换其他垂死的工人。
我是 Android Jetpack Compose 的新手。我想使用可观察的数据,当数据发生变化时,用户界面会自动更新。我遇到的解决方案有两种:
@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)