多线程浅析
- 线程简介
-
-
- 程序、进程、线程
- Java中的线程
- 线程的生命周期
-
- Java中创建多线程
- 多线程的同步和死锁
线程简介
程序、进程、线程
- 程序是一段静态的代码, 是应用软件执行的蓝本
- 进程是程序的一次动态执行过程, 对应了从代码加载、执行至执行完毕的一个完整过程, 这个过程也是进程本身从产生、发展至消亡的过程
- 线程是比进程更小的执行单位。, 形成多条执行线索。每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。
线程和进程的区别
- 新建状态:线程对象, 还没有在其上调用start()方法
- 就绪状态:当线程, 但时线程所处的状态
- 运行状态:线程调度程序可从运行池中选择一个线程作为时线程所处的状态,这也是线程进入运行状态的唯一方式
- 阻塞状态:线程仍旧是活的,但是当前。它是可运行的,当某件事件出现,他可能返回到可运行状态
- 死亡状态:当线程的时就认为它死去。线程一旦死亡,就不能复生。 一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常
操作系统中睡眠、阻塞、挂起的区别形象解释
Java中创建多线程
在此留下之前写过的一篇创建多线程的博客链接
创建线程的三种方式
以下为补充内容。
-
每个线程都有优先权,具有较高优先级的线程优先于优先级较低的线程执行
-
创建线程的方式对比
优点:编写简单,如果需要访问当前线程,
缺点:Java为单继承的继承机制,由于已经继承了Thread类,不能再继承其他的父类优点:
1)只实现了Runnable接口,还可继承其他的类
2)该方式可多个线程,非常适合多个线程来处理同一份资源的情况,从而可以将代 码与数据分开,形成清晰的模型,较好地体现了面向对象的思想
缺点:
编程稍微复杂,需要访问当前线程,必须使用 -
相关的细节吧:
(2)一个线程的run方法执行结束后,该线程结束。
(3)运行状态需要CPU调度,JVM去操控的。Run不是程序员调用的,是JVM调用的 -
相关的方法
(1)isAlive():测试线程的状态,新建、死亡、阻塞状态的线程返回false
(2)interrupt():“吵醒”休眠的线程,唤醒“自己”
(3)yield():暂停正在执行的线程,让同等优先级的线程运行,进入
让同等优先级的线程运行“,有可能当前线程依然被调用
(4)join():当前线程等待调用该方法的线程结束后,再排队等待CPU资源,进入(5)sleep方法实现线程的睡眠,暂停执行,在苏醒之前不会返回到可运行状态,当睡眠时间到期,则返回
(6)stop()终止线程
-
线程的优先级
(1)多线程运行时,JVM的调度策略为,级别相同时由操作系统按时间片来分配。(线程优先级通常表示为1~10的数字)
(2)设置线程优先级(线程默认优先级是创建它的执行线程的优先级)setPriority()设置线程的优先级, getPriority()得到线程优先级
(3)当线程池中线程都具有相同的优先级,调度程序的操作有两种可能:一是选择一个线程运行,直到它阻塞或者运行完成为止;二是时间分片,为池内的每个线程提供均等的运行机会
(4)线程让步:yield方法
(5)线程阻塞:join方法
多线程的同步和死锁
-
多线程程序在设计上最大的困难在于,各个线程的控制流彼此独立,使得各个线程之间的代码是 乱序执行 的,而且各个线程共享资源,所以多线程会带来 等一系列问题
-
线程同步:当两个或两个以上线程访问同一资源时,需要某种方式来确保资源在某一时刻只被一个线程使用
java引入了 对象互斥锁 的概念,来保证共享数据操作的完整性,从而避免上述问题 -
每个对象都有一个 “互斥锁”
关键字 与对象互斥锁联合起来使用保证对象在任意时刻只能由一个线程访问
synchronized可以修饰方法,表示这个方法在任意时刻只能由一个线程访问
下面这个代码对于同一个对象,两个方法只能运行一个
synchronized可以修饰类,则表明共用一把锁
举一个栗子,12306卖票,不同窗口之间要实现票数的共享
在实现Runnable接口的类中,写了四种卖票的方法,区别为锁的对象不同。可尝试运行看看效果,锁的应该为共享的资源
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!