线程与进程
进程是一个独立的运行环境,它可以被看作一个程序或者一个应用。
线程是在进程中执行的一个路径。线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。
不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。
使用线程池的原因
多个线程频繁地创建销毁耗时,影响效率,占用了大量资源,缺乏统一管理.
线程池的好处:
1,创建线程池,统一管理线程,避免资源浪费.
2对线程进行复用,线程在执行完任务后不会立刻销毁,而会等待另外的任务,这样就不会频繁地创建、销毁线程和调用GC。提高了效率.
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
...
}
corePoolSize: 该线程池中核心线程的数量。
maximumPoolSize:该线程池中最大线程数量。(区别于corePoolSize)
keepAliveTime:从字面上就可以理解,是非核心线程空闲时要等待下一个任务到来的时间,当任务很多,每个任务执行时间很短的情况下调大该值有助于提高线程利用率。注意:当allowCoreThreadTimeOut属性设为true时,该属性也可用于核心线程。
unit:上面时间属性的单位
workQueue:任务队列,后面详述。
threadFactory:线程工厂,可用于设置线程名字等等,一般无须设置该参数。
//创建基本线程池
final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3,5,1,TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(100));
FixedThreadPool (可重用固定线程数)
//创建fixed线程池
final ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
CachedThreadPool (按需创建)
//创建Cached线程池
final ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
SingleThreadPool(单个核线的fixed)
//创建Single线程池
final ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
ScheduledThreadPool(定时延时执行)
//创建Scheduled线程池
final ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
自定义的PriorityThreadPool(队列中有优先级比较的线程池)
//创建自定义线程池(优先级线程)
final ExecutorService priorityThreadPool = new ThreadPoolExecutor(3,3,0, TimeUnit.SECONDS,new PriorityBlockingQueue<Runnable>());
多线程编程的好处是什么?
在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态。
开启线程方法
一、继承 Thread 类,扩展线程。
二、实现 Runnable 接口。
多线程实现
1)Activity.runOnUiThread(Runnable)
2)View.post(Runnable) ;View.postDelay(Runnable , long)
3)Handler
4)AsyncTask
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
int i = 30;
textView.setText(""+i+" s");
}
}
});