编程问题中相当大的一部分都可以通过顺序编程来解决,并发编程是指针对某些问题,并发的执行程序中的多个部分,能充分的利用处理器资源,极大地提高程序执行的速度。
并发的多面性
并发编程的主要原因是,使用并发时需要解决的问题有多个,而实现并发的方式有多重,两者之间没有明显的映射关系。Java在并发编程的实现采用了更加传统的方式,在顺序型语言的基础上提供对线程的支持。
基本的线程机制
并发编程是我们可以将程序划分为多个分离的、独立运行的任务,通过使用多线程机制,这些独立任务中的每一个都将由执行线程来驱动,一个线程就是在进程中的一个单一的顺序控制流,因此,单个进程可以拥有多个并发执行的任务,但是你的程序使得每一个任务都好像有其自己的cpu一样,其底层机制是切分CPU时间,通常不需要考虑(详见 JAVA编程思想)
定义任务
线程可以驱动任务,因此需要一种描述任务的方式,这可以由 Runnable接口来提供,要定义任务只需要实现Runnable接口并且重写run()方法,使得该任务可以执行你的命令
public class MyRunnable implements Runnable {
@Override
public void run () {
// TODO
}
}
将Runnable对象转变为工作任务的传统方式是把它交给一个Thread的构造器,
Thread t = new Thread(new MyRunnable());
t.start();
调用Thread对象的start方法为该线程执行必须的初始化操作,然后执行Runnable中的run方法,以便在新线程中启动该任务,
如果要获取线程结束的返回值可以了解一下Callable接口
线程池的理解
线程安全
多个线程在操作同一个数据的时候可能会发生一些数据不同步的问题,最常用的解决方法是加同步锁“synchronized”,
免锁容器:对容器的修改可以与读取操作同时发生,只要读取者能看到完成修改的结果计科,这个修改在容器的数据结构的某个部分的一个单独的副本上执行的,这个副本对用户不可见。只有当修改完成时,被修改的数据结构才会自动的与主结构进行交换。