Java并发编程的艺术学习三

Java并发编程基础

线程简介

线程

线程是操作系统调度的最小单元,也叫轻量级进程,在一个进程中可以有多个线程,这些线程有各自的计数器、堆栈和局部变量等属性,并且能够访问共享变量。

线程的优先级

线程会等待时间分片,优先级就是决定线程需要多或少分配一些处理器资源的线程属性,通过**setPriority(int)**设置,该设置不一定生效,因此,程序的正确性不能依赖线程的优先级高低。

设置线程优先级时,针对频繁阻塞(休眠或IO操作)的线程需要设置高优先级,而偏重计算(需要较多CPU时间或偏运算)的线程设置较低的优先级,确保处理器不会被独占。

线程的状态

在给定的一个时刻,线程只能处于其中的一个状态:NEW、RUNNABLE、BLOCKED、WAITING、TIME_WAITING和TERMINATED。可以通过jstack工具,尝试查看示例运行时的线程信息。

Daemon线程

Daemon线程是守护线程,主要被用于在程序中后台调度以及支持性工作。当一个虚拟机中不存在非Daemon线程时,虚拟机会退出,通过**Thread.setDaemon(True)**将线程设置为守护线程。

在构建Daemon线程时,不能依靠finally块中的内容来确保执行关闭或清理资源的逻辑,因为虚拟机退出时Daemon线程中的finally块并不一定会执行。

启动和终止线程

(1)构造线程
(2)启动线程
调用线程的start()方法。
(3)终止线程
1).中断

中断可以理解为线程的一个标识位属性,它表示一个运行中的线程是否被其他线程进行了中断操作(其他线程通过调用该线程的**interrupt()**方法)。

线程通**过isInterrupted()**方法来进行判断是否被中断,中断标识不会被复位。

线程通过静态方法**Thread.interrupted()**对当前线程的中断标识位进行复位。

PS:如果抛出InterruptedException,会对中断标识位进行复位。
2).安全地终止线程

通过中断终止线程
通过布尔变量控制是否需要终止线程

线程间的通信

volatile和synchronized关键字

(1)volatile
该关键字修饰变量,就表示程序对该变量的访问必须从共享内存中获取,而对该变量的修改必须刷回共享内存,以此保证了该变量对于所有线程的可见性。该关键字过多使用会影响性能。
(2)synchronized
该关键字可修饰方法或者代码同步块,确保多个线程在同一时刻只能由一个线程访问被修饰的方法或者代码同步块,保证了线程对变量访问的可见性和排他性。

PS:任意一个对象都有自己的监视器,当这个对象由同步块或者这个对象的同步方法调用时,执行的线程必须先获取该对象的监视器,没有获取到的线程会被阻塞在同步块或者同步方法的入口,进入同步队列和BLOCKED状态。

等待/通知机制

生产者负责修改对象,消费者负责使用对象,进而在操作层面进行解藕,体系结构上具有更好的伸缩性。可以让消费者通过睡眠来减少无效的使用未被生产者修改的对象来减少开销。
生产者和消费者问题:
(1)及时性。睡眠时不会消耗处理器资源,但是睡眠时间太久,及时性很低。
(2)开销。降低睡眠时间会导致处理器消耗升高。
此类问题可以通过Java内置的等待/通知机制解决。该机制相关方法定义在Object类上,因此,所有的Java对象都具备。

相关方法如下:
notify()
notifyAll()
wait()
wait(long)
wait(long,int)

该机制通过线程A调用对象O的wait()方法进入等待状态,而另一个线程B调用对象O的notify()/notifyAll()方法,线程A收到通知后从对象O的wait()方法返回,进行后续操作,以此达到两个线程之间的交互。

PS:
(1)使用wait()、notify()和notifyAll()时需要先对调用对象加锁。
(2)调用wait()后,线程状态由RUNNING变为WAITING(),并将当前线程放入对象的等待队列。
(3)调用notify()或者notifyAll()会将线程从等待队列移动到同步队列中
(4)wait()返回的前提是获得了调用对象的锁。

Thread.join()的使用

如果在线程A中调用了线程B的B.join(),意味着当前线程A等待线程B终止后才从join()返回。

join()
join(long mills)
join(long mills, int nanos)

ThreadLocal的使用

ThreadLocal为线程变量,以ThreadLocal对象为键,任意对象为值得存储结构,一个ThreadLocal对象会被绑定到一个线程上。具有set()和get()方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值