2016-11-25 65 views
0

我正在写一个android应用程序。 在主线程中,可以定义方法然后调用方法,这有助于保持代码清洁。在一个新线程中,如何定义方法以避免将所有代码写入“一个块”?是否可以调用在主线程中定义的方法,或者可以以某种方式在新线程中定义它们? 所以要清楚,我想这样做是:如何为线程创建方法?

volatile Runnable feedToBuffer = new Runnable() 
     { 
      @Override 
      public synchronized void run() 
{ 
    if(boolean) 
    { 
    MethodA(); 
    } 
    else 
    { 
    MethodB(); 
    } 
} 

,而不是这样的:

volatile Runnable feedToBuffer = new Runnable() 
      { 
       @Override 
       public synchronized void run() 
    { 
     if(boolean) 
     { 
     //Code that was in MethodA 
     } 
     else 
     { 
     //Code that was in MethodB 
     } 
    } 
} 

这可能吗? 我意识到这个信息可能在那里,但没有找到它,所以非常感谢任何帮助。 :)

+1

是的,当然,这是可能的。 'run'方法只是一个普通的方法,它也可以调用其他方法。 – Thilo

+2

刚刚在run()...之后定义了这些方法''new Runnable(){/ *在这里我可以创建每个我想要的方法* /}' – AxelH

+3

'synchronized'运行方法很奇怪。你为什么补充说? – Thilo

回答

1

这是完全可能的。线程只是一系列操作,如果涉及方法调用,它将在该序列中执行。没关系。

线程与您的代码结构无关。您开始的线程与您在应用程序启动时的线程之间的主要区别在于入口点。当Android启动主线程时,它会在许多点进入您的应用程序,这些活动可能是生命周期调用,如onCreate()或按钮点击侦听器。当你创建一个新的线程时,你的输入点是你可以调用任何你想要的方法的run方法。

还有一个区别在于主线程运行事件循环。基本上,它有一个必须处理的消息队列。每次到达队列时,它都会处理消息,然后返回到等待状态。在这个意义上,主线程永远不会结束。然而,当你的线程到达run方法的末尾时停止。当然,你可以自己为你的线程实现一个类似的事件循环。

除此之外,线程的运行方式没有根本的区别,您可以自由地从任何线程中调用方法。当然,多线程的规则就像避免阻塞主线程,同步等一样,但在一个答案中覆盖太多。

+0

所以基本上,我可以从main调用一个方法,只要我没有尝试做它之前,它已经有时间来定义或在相同的时间不同的线程正试图使用​​它?这是很好的知道,我会去在这个案例中分别定义线程中的方法,因为它看起来最安全,但会检查到同步 - 似乎很重要。 :) – gnyrfta

+1

@gnyrfta如果他们不修改任何东西,你可以同时调用相同的方法。如果他们这样做,那么你需要意识到同步编写正确的程序。我会把你引用到[Oracle的并发教程](https://docs.oracle。COM/JavaSE的/教程/本质/并发/ index.html的)。你真的需要阅读它们,否则你可能会写出不正确的代码,这些代码在大多数情况下都可以正常工作,但却意外失败。对于更先进的东西,我建议您阅读Java Concurrency in Practice,它是一本非常有用的书。 – Malcolm

+0

谢谢!我会看看。 – gnyrfta