GVKun编程网logo

Android中Thread.currentThread()。getId()和Process.myTid()之间的区别(thread.currentthread()和this)

14

本文的目的是介绍Android中Thread.currentThread的详细情况,特别关注。getId的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解Android

本文的目的是介绍Android中Thread.currentThread的详细情况,特别关注。getId的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解Android中Thread.currentThread的机会,同时也不会遗漏关于$ .ajax()和$ .get()和$ .load()之间的区别、Android Java runOnUiThread()、Android中Thread.currentThread()getId()和Process.myTid()之间的区别、Android中的新Thread(task).start()VS ThreadPoolExecutor.submit(task)的知识。

本文目录一览:

Android中Thread.currentThread()。getId()和Process.myTid()之间的区别(thread.currentthread()和this)

Android中Thread.currentThread()。getId()和Process.myTid()之间的区别(thread.currentthread()和this)

众所周知

myTid() - 返回调用线程的标识符,该标识符与setThreadPriority(int,int)一起使用。

但是我发现Thread.currentThread().getId()不等于Process.myTid()。因此,我猜前者是JVM版本的线程ID,后者是Linux版本的线程ID。

我对吗?如果是这样,为什么Java会创建自己的线程ID而不使用Linux线程ID?

更新:

经过进一步研究并阅读了android的源代码,我有了新的认识:

Process.myTid()是与平台(OS)相关的操作,Process.setThreadPriority()在android的本机级别源中也是如此,它们都调用系统调用来实现目标。

但是java是一种与平台无关的语言,java并不强制主机os需要“
tid”或getTid()方法,因为另一个os可以通过字符串键(仅作为示例,:)来标识其线程。然后,java用自己的方式标识其线程,在java作用域中分配一个唯一的线程ID,如果Java提供了像这样的静态api
Process.setThreadPriority(),则Java作用域ID肯定是一个参数,但是我们不需要,因为我们可以通过调用来实现线程对象方法setPriority(intpriority)

欢迎任何评论。

更新:

答案都是正确的。但是法登的评论使我更加清楚。谢谢你们。

答案1

小编典典

我相信Java环境中有两种类型的线程:

  • 本机线程: 由托管操作系统管理。
  • Java线程: 由JVM管理并与本机线程通信。

$ .ajax()和$ .get()和$ .load()之间的区别

$ .ajax()和$ .get()和$ .load()之间的区别

$.ajax()$.get()和有$.load()什么区别?

在哪个条件下使用哪个更好?

Android Java runOnUiThread()

Android Java runOnUiThread()

我一直在弄乱runOnUiThread方法。如果我只是在活动中创建一个方法:

public void Test(){    runOnUiThread(new Runnable()     {        public void run()         {            Log.v("mainActivity", "test");        }    });     }

我注意到该可运行对象仅运行一次。但是,这不是问题。我想知道的是,如果我完全遗漏了某些东西,并且它在后台执行了某些操作,当我多次执行该方法时,它将导致帧速率下降。

答案1

小编典典

这是Activity.runOnUiThread(Runnable)的全文:

public final void runOnUiThread(Runnable action) {    if (Thread.currentThread() != mUiThread) {        mHandler.post(action);    } else {        action.run();    }}

该方法的主体是在你的后台线程仍然执行,类mHandler
android.os.Handler实现了的Runnable内部队列中的发布到它,所以,除非你正在做的工作,堵在了Runnable(这是一个
很大的 不不上(UI线程)或在短时间内调用此方法一千次以上,您应该不会看到任何区别。

现在,如果您正在调用Handler.postAtFrontOfQueue(Runnable),那么就会出现问题,因为您的Runnable本质上是“
插队
”。在这种情况下,这可能会导致结结,因为正在执行您的Runnable而不是需要进行的任何UI更新(如滚动)。

请注意,您只 需要 在UI线程上运行UI更新,例如在View上调用任何方法(因此称为“ UI
Thread”以及该方法的存在原因)或文档明确指出需要在其上运行的任何操作。 UI线程。否则,如果您已经在使用后台线程,则没有真正的理由离开它。

Android中Thread.currentThread()getId()和Process.myTid()之间的区别

Android中Thread.currentThread()getId()和Process.myTid()之间的区别

众所周知

myTid() - 返回调用线程的标识符,该标识符与setThreadPriority(int,int)一起使用。

但是我发现Thread.currentThread().getId()不等于Process.myTid()。因此,我猜前者是JVM版本的线程ID,后者是Linux版本的线程ID。

我对吗?如果是这样,为什么Java会创建自己的线程ID而不使用Linux线程ID?

更新:

经过进一步研究并阅读了android的源代码,我有了新的认识:

Process.myTid()是与平台(OS)相关的操作,Process.setThreadPriority()在android的本机级别源中也是如此,它们都调用系统调用来实现目标。

但是java是一种与平台无关的语言,java并不强制主机os需要“
tid”或getTid()方法,因为另一个os可以通过字符串键(仅作为示例,:)来标识其线程。然后,java用自己的方式标识其线程,在java作用域中分配一个唯一的线程ID,如果Java提供了像这样的静态api
Process.setThreadPriority(),则Java作用域ID肯定是一个参数,但是我们不需要,因为我们可以通过调用来实现线程对象方法setPriority(int priority)

欢迎任何评论。

更新:

答案都是正确的。但是法登的评论使我更加清楚。谢谢你们。

Android中的新Thread(task).start()VS ThreadPoolExecutor.submit(task)

Android中的新Thread(task).start()VS ThreadPoolExecutor.submit(task)

在我的Android项目中,我有很多地方需要异步运行一些代码(Web请求,对db的调用等)。这不是长时间运行的任务(最多几秒钟)。到目前为止,我一直在通过创建新线程,将任务传递给新的可运行线程来进行此类操作。但是最近我读了一篇有关Java中线程和并发的文章,并且了解到为每个任务创建一个新的Thread并不是一个好的决定。

所以现在我ThreadPoolExecutor在我的Application课堂上创建了一个包含5个线程的。这是代码:

public class App extends Application {

    private ThreadPoolExecutor mPool;

    @Override
    public void onCreate() {
        super.onCreate();

        mPool =  (ThreadPoolExecutor)Executors.newFixedThreadPool(5);
    }
}

而且我还有一种方法可以将Runnable任务提交给执行者:

public void submitRunnableTask(Runnable task){
    if(!mPool.isShutdown() && mPool.getActiveCount() != mPool.getMaximumPoolSize()){
        mPool.submit(task);
    } else {
        new Thread(task).start();
    }
}

因此,当我想在代码中运行异步任务时,我得到的实例,App并调用submitRunnableTask将可运行对象传递给它的方法。如您所见,我还检查线程池中是否有空闲线程来执行任务,否则,我将创建一个新线程(我不认为会发生这种情况,但是无论如何……我不会希望我的任务排在队列中并降低应用速度)。

onTerminate应用程序的回调方法中,我关闭了池。

所以我的问题是:这种模式是否比在代码中创建新线程更好?我的新方法有什么优点和缺点?会导致我尚不了解的问题吗?您能建议我一些比这更好的方法来管理我的异步任务吗?

PS:我在Android和Java方面有一定的经验,但是我并不是一名并发专家。)因此,在某些问题上可能有些方面我不太了解。任何建议将被认真考虑。

我们今天的关于Android中Thread.currentThread。getId的分享已经告一段落,感谢您的关注,如果您想了解更多关于$ .ajax()和$ .get()和$ .load()之间的区别、Android Java runOnUiThread()、Android中Thread.currentThread()getId()和Process.myTid()之间的区别、Android中的新Thread(task).start()VS ThreadPoolExecutor.submit(task)的相关信息,请在本站查询。

本文标签: