码迷,mamicode.com
首页 > 编程语言 > 详细

线程1

时间:2015-03-03 18:28:32      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

线程是程序执行的线路、路径。线程本质由硬件CPU决定,大家在攒机选购CPU的时候经常看到厂商宣传多线程由此便是证明。那么既然线程本质是由CPU决定,那么我们通过java代码又是如何对其进行操控的呢?事情是这样的,CPU线程再牛逼也要去支持系统(例如:winter组合)CPU将线程控制的权限与对线程操作的方法交给了系统,然后我们的java虚拟机再通过调用系统相关程序获取CPU部分操控权(部分操控权是指java虚拟机对CPU操控权利的只能是一部分,不能无限放大全部霸占),java虚拟机又将线程封装为对象,对线程的操作封装为方法。那么就形成了我们苦逼程序员所面对的Thread类与其方法。整个流程:CPU决定与控制线程的整个生命周期---------->权限交给系统----------->java虚拟机通过调用系统相关程序获取CPU部分操控权--------->java虚拟机将线程的操控权封装为Thread类与其方法供java程序调用

线程既然是程序执行的线路、路径,那么必然会有路的开始、结束、坎坷等多种状态。在java世界里对线程的当前状态有专门的枚举类对其封装Thread.State。1>Thread.State.NEW线程进入异步状态2>Thread.State.RUNNABLE进入执行状态 3>Thread.State.BLOCKED此线程在执行某一段上锁的代码时发现此段代码已经被另一条线程获得监视器锁那么此时此条线程当前状态即为BLOCKED 4>Thread.Status.TIME_WAITING将可执行任务执行完毕但是还未消亡此时线程可以通过唤醒机制将其唤醒重新进入RUNNABLE状态。5>Thread.Status.TERMINATED生命周期已经消亡的线程,但是此线程对象还存在虚拟机中尚未被回收。

线程分类:用户线程User Thread,守护线程Daemon Thread (说明:本质上CPU对多线程的支持并没有区分用户线程与守护线程,完全是java虚拟机构造的机制)守护线程服务于用户线程,当用户线程全部退出时,守护线程也随之消亡,所有的守护线程会等到一个用户线程也没有时,才会随着虚拟机消亡。(例如:java虚拟机的GC线程)设置为守护线程必须在线程启动执行之前进行设置,即.setDaemon(true)必须在.start()之前进行设置。生成守护线程的两种方式:1>在用户线程中创建线程并设置.setDaemon(true) 2>在守护线程创建的线程也为守护线程。守护线程用途与禁区:守护线程主要用于非耗时的异步线程,例如任务分发,耗时的流的读取,逻辑计算不可使用守护线程,因为当用户线程全部执行完毕后,守护线程如果还有尚无完成的任务那么会造成数据泄露。典型例子:线程池中的调度线程即为守护线程,因为线程池收到请求任务后进行分发不是一个耗时任务,几乎瞬间完成。

线程状态的切换:wait()进入Thread.State.TIME_WAITING状态, notify() 与notifyAll()进入Thread.Status.RUNNABLE状态,在Thread.Status.RUNNABLE状态下会出现睡眠状态Thread.sleep(long time)此时会放弃CPU执行权但不释放锁<------>通过.interrupt()将其唤醒。

线程优先级调整:MAX_PRIORITY最高优先级, MIN_PRIORITY最低优先级,Thread.yield获得CPU 使用权之后将权利放弃重新争取,join解释:某一特定线程获取到CPU使用权之后没有急于执行代码而是在其RUNNABLE状态下坐等插入线程(在此线程run方法中调用.join()方法的线程)执行完毕之后再执行自己的代码,说白了就是活雷锋帮别人抢CPU使用权。Thread.sleep(long time)释放CPU执行权,但是不释放锁,依旧阻止其他线程执行。

线程Thread重点方法:获取当前线程对象Thread.currentThread() 获取线程名称.getName()

线程同步代码:为了防止同一时间对数据的操作出现数据计算错乱情况,我们需要保证在多线程情况下对数据的操作仅能在一条线程中执行,那么我们就需要对所有对数据操作的方法或者代码块添加保护锁即synchronized,它能保证synchronized下的所有代码同一时间仅能在一条线程中执行,但是并不会影响到其他费synchronized的代码。切记:synchronized阻塞的是同一时间、同一对象、所有synchronized情况下的不同线程 。简单解释一下,为了防止多线程同时访问数据操作代码,需要一个线程一个线程的访问执行,所以synchronized起到作用的前提条件是:多线程、同时访问。至于同一对象,这个条件可有可无,如果没有“同一对象”这个条件必须保证不同对象共享一个数据源static

线程之间通信:

---未完待续

线程1

标签:

原文地址:http://www.cnblogs.com/android001/p/4311528.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!