在Android中,runnable传递到Executors.newSingleThreadScheduledExecutor运行上的线程是什么?
In Android, what thread is runnable passed to Executors.newSingleThreadScheduledExecutor running on?
在 Android 中,运行nable 传递给 ScheduledExecutorService#schedule(Runnable command, long delay, TimeUnit unit) returned from 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)
在 Android 中,运行nable 传递给 ScheduledExecutorService#schedule(Runnable command, long delay, TimeUnit unit) returned from 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)