1.实例方法t1.interrupt()中断线程
线程中断并不会立即使线程退出,告知目标线程中断(设置中断标识位,表示当前线程已经被中断了),至于目标线程接到通知后如何处理,则完全由目标线程自行决定。
实例方法t1.isInterrupted():检查中断标识位,判断当前线程是否被中断;
静态方法Thread.interrupted():判断当前线程的中断状态,并清除当前线程的中断标识位。
2.被废弃方法
Thread.stop():会直接终止线程,并且会立即释放这个线程所持有的锁。
suspend():暂停线程,不释放任何锁资源,状态仍然是Runnable。
resume(): 继续执行,suspend后必须resume才能继续执行。
3. 等待线程结束join和谦让yield、sleep
join():一直阻塞当前线程,直到目标线程执行完毕;
eg: t1.join()则阻塞当前线程,等待目标线程t1执行完毕(即让调用线程wait在当前线程对象实例上);
join(long):阻塞当前线程long时间,若目标线程还未执行完毕,当前线程继续执行;
静态方法yield():使当前线程让出CPU(但还可以进行CPU资源的争夺),让给同等优先级或者更高优先级,进入就绪状态;
静态方法sleep():不考虑优先级,不释放锁,不让出系统资源,进入阻塞状态,需要捕获异常;Thread.sleep(0)会触发系统进行一次CPU竞争;
4.多线程协作等待wait和通知notify(需包含在synchronized语句中)
线程A获得obj的监视器后,调用了obj.wait()方法,那线程A释放obj的监视器,并进入obj对象的等待队列;
当线程B获得obj的监视器后,调用obj.notify()方法,那线程B释放obj的监视器,系统从obj对象的等待队列中随机唤醒一个线程如C;
C唤醒后尝试重新获取obj的监视器,获取成功后,继续执行代码;
5.同步(限制同时只有一个线程访问)
(1)volatile:只能保证可见性;表示这个变量会被多线程更改,只能保证一个线程修改后,另外的线程读到的是修改后的值;
(2)synchronized:保证可见性和有序性,可作用在对象,类,实例方法,静态方法上,不能响应中断;
(3)重入锁ReentrantLock:能响应中断,设置超时,有lock(),lockInterruptibly(),tryLock,tryLock(time),unlock方法;和Condition结合,实现等待-通知机制,如Condition cold = lock.newCondition(),一个lock可有多个Condition,如ArrayBlockingQueue有NOT_EMPTY和NOT_FULL的两个Condition;
6.多线程并发(允许多个线程同时访问)
(1)ReentrantReadWirteLock:读-读不限制,读/写或写-写限制
(2) 信号量Semaphore: 有方法acquire(),release(),tryAcquire()
(3) 倒计时器CountDownLatch:await()等待检查,countDown()完成一个线程
(4)循环栅栏CyclicBarrier:可以在计数完成后,执行指定的runnable,有await方法,线程等待;
7.线程阻塞工具类
(1)LockSupport:和Thread.suspend()相比(线程仍然处理Runnable状态),弥补了若resume()在suspend()前发生导致线程无法继续执行的情况;和Object.wait()相比,它不需要先获取某个对象的锁,也不会抛出InterruptedException异常;有park()(线程处于WAITING状态)和unpack()方法,为每个线程只准备一个许可;
8.线程池
Executors是线程池工厂,ThreadPoolExecutor是一个线程池,通过Executors可以创建各种类型的线程池。
public ThreadPoolExecutor(int corePoolSize,int maxPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
其中keepAliveTime:指超过corePoolSize的线程在多长时间内会被销毁;
threadFacatory: 用于创建线程、一般默认;
handler:拒绝策略,有AbortPolicy:直接抛出异常,阻止系统正常工作;CallerRunsPolicy:只要线程池未关闭,直接在调用者线程中运行当前被丢弃的任务;DiscardOledestPolicy:丢弃最老的请求;DiscardPolicy:默默丢弃任务;
(1)Executors.newFixedThreadPool(int nThread);其内部实现是
new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLSECONDS,new LinkedBlockQueue<Runnable>())
(2)Executors.newSingleThreadExecutor();其内部实现是
new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLSECONDS,new LinkedBlockQueue<Runnable>()));
(3)newCachedThreadPool();其内部实现是
new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>())
(4)newSingleThreadScheduledExecutor()
(5)newScheduledThreadPool(corePoolSize);
而newScheduledThreadPool得到的是一个ScheduledThreadPool,有schedule和scheduleAtFixedRate方法:以上一个任务开始执行时间为起点,之后的period时间,调度下一次任务;(若任务执行时间>调度周期period)那么调度周期会按照任务执行时间来;
scheduleWithFixedDelay方法:上一个任务结束后,再经过delay时间进行任务调度