新线程多次

时间:2015-12-17 10:09:56

标签: java android multithreading

我想在按下按钮时运行一个线程

public void ButtonClick(){

    Thread thread = new Thread(){
        public void run(){
            Log.i("Test", "I'm in thread");
        }
    };
    thread.start();
}

我的问题是:我想在此按钮上多次点击。在消息之后还有几个线程仍然存在"我在线程"打印?或者每次运行函数完成时,线程都会被销毁?

如果我创建了几个同时运行的线程,我该如何以干净的方式关闭它们?

感谢您的帮助!

4 个答案:

答案 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)

请查看此post和此article以获取更多选项。

  

如果我创建了几个同时运行的线程,我该如何以干净的方式关闭它们?

您可以关闭以下SE帖子中引用的ExecutorService

How to properly shutdown java ExecutorService

由于您使用的是Android,因此您还有一个更好的多线程替代方案:HandlerThreadHandler

有关详细信息,请参阅以下帖子:

Android: Toast in a thread

答案 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'
        }
      })