java - 在Android中,什么线程可运行传递给Executors.newSingleThreadScheduledExecutor运行?

标签 java android multithreading concurrency

在Android中,什么线程可运行传递给ScheduledExecutorService#schedule(Runnable command, long delay, TimeUnit unit)Executors#newSingleThreadScheduledExecutor() 返回运行在?

至于我的努力,我运行以下代码:

        final ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
        ses.schedule(new Runnable() {
            @Override
            public void run() {
                inflate.setBackgroundDrawable(background);
            }
        }, 200, TimeUnit.MILLISECONDS);
        ses.shutdown();

在 Moto G 2013、Android 5.0.2 上,setBackgroundDrawable 操作工作正常,意味着它在主 (UI) 线程上运行。

具体来说,这对于所有 Android 版本和设备都是如此吗?链接的 javadoc 页面对此没有任何说明。我想避免像服务可以生成一个新的单线程来运行操作之类的陷阱。

最佳答案

调用Executors.newSingleThreadScheduledExecutor()时,将创建一个新的Thread(属于同一ThreadGroup)。隐式使用的 DefaultThreadFactory 看起来像这样

static class DefaultThreadFactory implements ThreadFactory {
   private static final AtomicInteger poolNumber = new AtomicInteger(1);
   private final ThreadGroup group;
   private final AtomicInteger threadNumber = new AtomicInteger(1);
   private final String namePrefix;

   DefaultThreadFactory() {
       SecurityManager s = System.getSecurityManager();
       group = (s != null)? s.getThreadGroup() :
                            Thread.currentThread().getThreadGroup();
       namePrefix = "pool-" +
                     poolNumber.getAndIncrement() +
                    "-thread-";
   }

   public Thread newThread(Runnable r) {
       Thread t = new Thread(group, r,
                             namePrefix + threadNumber.getAndIncrement(),
                             0);
       if (t.isDaemon())
           t.setDaemon(false);
       if (t.getPriority() != Thread.NORM_PRIORITY)
           t.setPriority(Thread.NORM_PRIORITY);
       return t;
   }
}

如果你想重用 UI-Thread,你应该编写自己的 ThreadFactory 返回 UI-Thread 并调用 Executors.newSingleThreadScheduledExecutor(yourNewlyCreatedThreadFactory)

关于java - 在Android中,什么线程可运行传递给Executors.newSingleThreadScheduledExecutor运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28298654/

相关文章:

java - 编辑java类文件JAD

java - Libgdx 显示得分并每秒加 1 得分

java - 我应该怎样编写一个自动编辑 XML 文件的算法

java - 每个包的线程超时时的线程安全问题

c - Windows 线程的奇怪行为

c - 多个线程在没有锁的情况下递增共享变量但返回 "unexpected"输出

java - 如何获取动态cookie

java - 使用 If 检查整数

android - API 21 和 API 23 上的不同选择器行为

android - Android 上 Google 登录的 403 响应