Java多线程学习笔记

来源:互联网 发布:淘宝一元拍卖骗局揭秘 编辑:程序博客网 时间:2024/04/28 02:24

一、Java多线程基础:参考:Java多线程系列目录(共43篇)


1、Java创建线程的方式有两种:实现Runnable接口或直接继承Thread类;


2、通过重写run()方法来自定义自己的线程;通过执行start()方法来执行创建的进程;通过执行wait()方法来使当前进程(指当前在CPU上运行的线程)阻塞(当前进程必须拥有该对象的同步锁), wait()方法被调用后当前线程将变为阻塞,并释放该对象的同步锁,以便持有该对象的同步锁的其它进程执行(如notifyAll)。


3、interrupt()方法并不会立即终止正在运行的线程,而是将此线程的中断标记设为True,即通过isInterrupted()可返回true。若线程处于阻塞状态,此时调用其interrupt()方法,会立即将中断标记设为True,但是由于线程处于阻塞状态,所以该中断标记会立即被清除为false,同时会抛出一个InterruptedException。interrupted() 和 isInterrupted()都能够用于检测对象的“中断标记”。区别是, interrupted()除了返回中断标记之外,它还会清除中断标记(即将中断标记设为false);而isInterrupted()仅仅返回中断标记。


4、join()方法会调用wait()方法来阻塞当前进程,直至子线程执行完成以后,当前进程才会继续执行。


5、sleep()的作用同wait()方法作用类似,但唯一的区别是:sleep()不会释放锁,且调用sleep()时当前进程也无需拥有该对象的同步锁。


二、Java 线程池,参考:JAVA线程池的分析和使用,Java doc

Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

举例:

可缓存线程池:ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

定长线程池,控制最大并发数:ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); 

定长线程池,支持定时任务:ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

单线程化线程池:ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); 

0 0
原创粉丝点击