安卓线程 总结

参考 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);

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章