我想在按下按钮时运行一个线程
public void ButtonClick(){
Thread thread = new Thread(){
public void run(){
Log.i("Test", "I'm in thread");
}
};
thread.start();
}
我的问题是:我想在此按钮上多次点击。在消息之后还有几个线程仍然存在"我在线程"打印?或者每次运行函数完成时,线程都会被销毁?
如果我创建了几个同时运行的线程,我该如何以干净的方式关闭它们?
感谢您的帮助!
答案 0 :(得分:8)
“我在线程”消息之后是否仍存在多个线程 印刷?
没有。它们中的每一个都将被自动销毁。
如果我创建了几个同时运行的线程, 我该如何以干净的方式关闭它们?
无需停止线程,一旦完成任务(执行 run ),它们将自动销毁。
要处理并发性和安全性,您应该查看java.util.concurrent
,它是用于处理java中并发性的实用程序框架。
答案 1 :(得分:2)
打印出“我在线程中”消息后,是否还存在多个线程?或者每次运行函数完成时,线程都会被销毁?
在您的情况下,您创建了许多线程,因为为每次按钮单击创建了一个Thread。
在run()
方法中完成最后一个语句后,Thread的生命周期结束了。执行run()
方法后,该主题将进入TERMINATED
State并且无法重新运行。
更好的解决方案是不为每次按键点击创建新线程。如果您的应用程序中需要更多线程,请转到一个线程池。
Java为此提供了Executor框架。它以更好的方式管理Thread生命周期。
使用其中一个API,它将从Executors
返回ExecutorService
e.g。 newFixedThreadPool(4)
如果我创建了几个同时运行的线程,我该如何以干净的方式关闭它们?
您可以关闭以下SE帖子中引用的ExecutorService
:
How to properly shutdown java ExecutorService
由于您使用的是Android,因此您还有一个更好的多线程替代方案:HandlerThread和Handler
有关详细信息,请参阅以下帖子:
答案 2 :(得分:1)
每次创建线程都是一个坏主意使用线程池。
答案 3 :(得分:0)
创建一个实现Runnable而不是Anonymous线程的类...传递runnable对象创建任意多个线程因为创建Anonymous Runnable对象只创建一个对象,从而限制您实现您的要求。在创建另一个线程组或创建线程组(折旧)或线程池之前使用可调用而不是runnable来检查线程状态,并将其传递给一定大小的线程池,或者将runnable转换为callable,然后将其传递给池多少次你喜欢
.state('config', {
url:'/config',
views: {
'@':{
templateUrl: 'app/main/configuration/configuration.html',
},
'sidebar@config':{
templateUrl: 'app/main/configuration/configsidebar.html',
},
'heading@config':{
template: 'Configurations'
},
'content@config':{
template: '<p>some random content to be decided, mostly a dashboard.</p>'
},
'footer@config':{
templateUrl: 'app/main/configuration/footer.html',
}
},
controller: 'ConfigCtrl',
data: {
displayName: 'Config'
}
})