一、线程通信
线程通信可以确保线程能够按照预定的顺序执行 并且能够安全地访问共享资源还可以使多条线程更好的进行协同工作。
二、实现线程通信
等待唤醒机制
(1)使用wait()与notify()方法使线程等待或者唤醒某个线程。一般我们通过设置一个值加上判断语句进行线程的等待。
虽然使用这两种方法可以使进程等待但是仅限于两个进程通信,我将给出三个进程通信的实现。
可以看到我使用了notifyAll()方法替换了notify()方法,因为此方法可以使全部的线程唤醒,因为线程平常为唤醒状态所以通过循环语句判断进程是否等待。要注意以上方法都需要使用锁对象调用。
(2)
三、线程生命周期
线程被创建并启动以后,它并不是一启动就进入了执行状态,也不是一直处于执行状态。 线程对象在不同的时期有不同的状态
四、线程池
线程被创建出来是可以存储在一起等待使用的,所以我们选择建立线程池。
线程池的建立有两种方法,一种是使用JDK自带的还有一种是用户自定义线程池。
(1)JDK线程池
Executors 中提供静态方法来创建线程池
static ExecutorService newCachedThreadPool() 创建一个默认的线程池
static newFixedThreadPool (int nThreads) 创建一个指定最多线程数量的线程池
我们还需要给线程池钟传入任务,可以使用pool.submit()方法提交任务。该方法中需要提供一个实例化对象。可以如图创建。
最后使用pool.shutdown()停止。
(2)自定义线程池
使用ThreadPoolExecutor 类创建,其构造方法为
其含义分别为 核心线程数、最大线程数、空闲时间、时间单位、任务队列、线程对象任务工厂、拒绝策略。
五、单例设计模式
(1)单例指单个实例,保证类的对象在内存中只有一份。使用场景: 如果创建一个对象需要消耗的资源过多,比如 I/O 与数据库的连接 并且这个对象完全是可以复用的, 我们就可以考虑将其设计为单例的对象。
(2)两种方式,饿汉式与懒汉式。我们一般推荐饿汉式。
饿汉式代码演示:
好了我们的线程学习到此结束。