一、进程与线程
进程是正在运行的程序的实例,线程是程序中一个单一的顺序控制流程。一个进程可以同时运行多个线程,一个线程可以创建和撤消另一个线程。由于线程之间的相互制约,因此线程存在就绪、阻塞、运行三种基本状态。
二、线程状态转换
三、阻塞
1、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
2、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
3、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
四、同步
7种同步方法:http://www.cnblogs.com/XHJT/p/3897440.html
五、Runnabl实现线程
六、Thread实现线程
七、CountDownLatch同步工具
CountDownLatch是一个同步计数器类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。构造这个类的时候传入int参数,该参数是计数器的初始值,每调用一次countDown()方法,计数器就减1,计数器大于0时,await()方法会阻塞程序继续执行,让主程序等待子程序的结束。
主要方法
public CountDownLatch(int count);
public void countDown();
public void await() throws InterruptedException
八、Spring线程池ThreadPoolTaskExecutor
<!-- spring thread pool executor --> <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 线程池维护线程的最少数量 --> <property name="corePoolSize" value="5" /> <!-- 允许的空闲时间 --> <property name="keepAliveSeconds" value="200" /> <!-- 线程池维护线程的最大数量 --> <property name="maxPoolSize" value="10" /> <!-- 缓存队列 --> <property name="queueCapacity" value="20" /> <!-- 对拒绝task的处理策略 ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃.--> <property name="rejectedExecutionHandler"> <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /> </property> </bean>
四种策略
ThreadPoolExecutor.AbortPolicy() 抛出java.util.concurrent.RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy() 重试添加当前的任务,他会自动重复调用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy() 抛弃旧的任务
ThreadPoolExecutor.DiscardPolicy() 抛弃当前的任务
线程池应用:昨晚给的链接,早上看了下,不是很对,今天重新整理一份补上。