参考 https://blog.csdn.net/qq_22393017/article/details/79356115
5、android 创建线程的三种方式
一、继承Thread类创建线程类
(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。
(2)创建Thread子类的实例,即创建了线程对象。
(3)调用线程对象的start()方法来启动该线程。
二、通过Runnable接口创建线程类
(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
(2)创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
(3)调用线程对象的start()方法来启动该线程。
三、通过Callable和Future创建线程
(1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
(2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
(3)使用FutureTask对象作为Thread对象的target创建并启动新线程。
(4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
6、线程池ThreadPoolExecutor
一、ThreadPoolExecutor mExecutor = new ThreadPoolExecutor(//
mCorePoolSize, // 核心线程数
mMaximumPoolSize,// 最大线程数
mKeepAliveTime,// 保持时间
unit,// 保持时间的单位
workQueue,// 工作队列
threadFactory,// 线程工厂
handler// 异常捕获器
);
/**提交任务*/
public Future<?> submit(Runnable task) {
initThreadPoolExecutor();
Future<?> submit = mExecutor.submit(task);
return submit;
}
/**执行任务*/
public void execute(Runnable task) {
initThreadPoolExecutor();
mExecutor.execute(task);
}
/**移除任务*/
public void remove(Runnable task) {
initThreadPoolExecutor();
mExecutor.remove(task);
}
//关闭线程池
public void shutUpNow(){
if (mExecutor != null){
mExecutor.shutdownNow();
}
}
二、newCachedThreadPool
private ExecutorService service = null;
private CacheRunable cacheRunable;
private Future<?> cacheRunableFuture;
/**
* 开始缓冲处理线程
*/
private void startCacheRunner() {
if (service != null) {
service.shutdownNow();
service = null;
}
service = Executors.newCachedThreadPool();
//开始接收线程
if (cacheRunable == null) {
cacheRunable = new CacheRunable();
}
cacheRunableFuture = service.submit(cacheRunable);
}
if (service != null) {
service.shutdownNow();
service = null;
}
if (cacheRunableFuture != null) {
cacheRunableFuture.cancel(true);
}
/**
* @Description 缓冲区处理线程
*/
private class CacheRunable implements Runnable {
三、newFixedThreadPool
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(new Runnable() {
@Override
public void run() {
}
});
四、newSingleThreadExecutor
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(new Runnable() {
@Override
public void run() {
}
});
五、ScheduledExecutorService
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
Runnable runnable = new Runnable(){
@Override
public void run() {
//TODO method();
}
};
//延迟一秒执行
scheduledExecutorService.schedule(runnable, 1, TimeUnit.SECONDS);
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
Runnable runnable = new Runnable(){
@Override
public void run() {
//TODO method();
}
};
//延迟三秒后,执行周期一秒的定时任务
scheduledExecutorService.scheduleAtFixedRate(runnable, 3, 1, TimeUnit.SECONDS);
六、如何终止线程池中的某个线程任务?
一般线程执行完run方法之后,线程就正常结束了,因此有如下几种方式来实现:
4.1 利用 Future 和 Callable。
步骤:
实现 Callable 接口
调用 pool.submit() 方法,返回 Future 对象
用 Future 对象来获取线程的状态。
private void cancelAThread() {
ExecutorService pool = Executors.newFixedThreadPool(2);
Callable<String> callable = new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("test");
return "true";
}
};
Future<String> f = pool.submit(callable);
System.out.println(f.isCancelled());
System.out.println(f.isDone());
f.cancel(true);
}