美文网首页
Java技术笔记

Java技术笔记

作者: G小曲 | 来源:发表于2018-10-24 17:38 被阅读0次

本期是Java知识点最后一期,更多知识可咨询科多大数据领取视频观看。

线程共有5中状态:新建、可运行(runnable)、运行(running),阻塞和死亡。

当使用new操作符创建新线程时,线程处于“新建”状态。

当调用start()方法时,线程处于可运行状态。

阻塞状态是指线程因为某种原因放弃了cpu 使用权,即让出了cpu分片时间,暂时停止运行。直到线程进入可运行状态,才有机会再次获得cpu时间转到运行状态。

阻塞的情况分三种:

(一). 等待阻塞:运行的线程执行o.wait()方法,JVM会把该线程放入等待队列中。

(二). 同步阻塞:运行的线程在获取对象的同步锁时,该锁正被其他线程拥有,则JVM会把该线程放入锁池(lock pool)中。

(三). 其他阻塞:运行的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。

当run()方法运行完毕或出现异常时,线程处于终止状态。

1)start方法:start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程来执行用户定义的子任务,在这个过程中,会为相应的线程分配需要的资源。

2)run方法:run()方法是不需要用户来调用的,当通过start方法启动一个线程之后,当线程获得了CPU执行时间,便进入run方法体去执行具体的任务。注意,继承Thread类必须重写run方法,在run方法中定义具体要执行的任务。

3)sleep方法:sleep相当于让线程睡眠,交出CPU,让CPU去执行其他的任务。但是有一点要非常注意,sleep方法不会释放锁,也就是说如果当前线程持有对某个对象的锁,即使调用sleep方法,其他线程也无法访问这个对象。

注意,如果调用了sleep方法,必须捕获InterruptedException异常或者将该异常向上层抛出。当线程睡眠时间满后,不一定会立即得到执行,因为此时可能CPU正在执行其他的任务。所以说调用sleep方法相当于让线程进入阻塞状态。

4)yield方法:调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。

  注意,调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的。

sleep() 方法在指定的睡眠时间内一定不会再得到运行机会,直到它的睡眠时间完成;而 yield() 方法让出控制权后,还有可能马上被系统的调度机制选中来运行,比如,执行yield()方法的线程优先级高于其他的线程,那么这个线程即使执行了 yield() 方法也可能不能起到让出CPU控制权的效果,因为它让出控制权后,进入排队队列,调度机制将从等待运行的线程队列中选出一个等级最高的线程来运行,那么它又(很可能)被选中来运行。

5)join方法:假如在main线程中,调用thread.join方法,则main方法会等待thread线程执行完毕或者等待一定的时间。如果调用的是无参join方法,则等待thread执行完毕,如果调用的是指定了时间参数的join方法,则等待一定的时间。

当调用thread1.join()方法后,main线程会进入等待,然后等待thread1执行完之后再继续执行。

  实际上调用join方法是调用了Object的wait方法,这个可以通过查看源码得知。join方法同样会让线程释放对一个对象持有的锁。

wait方法会让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限。

6)interrupt方法:单独调用interrupt方法可以使得处于阻塞状态的线程抛出一个异常,也就说,它可以用来中断一个正处于阻塞状态的线程;另外,通过interrupt方法和isInterrupted()方法来停止正在运行的线程。

interrupt方法可以中断处于阻塞状态的线程。不能中断正在运行中的线程。但是如果配合isInterrupted()能够中断正在运行的线程,因为调用interrupt方法相当于将中断标志位置为true,那么可以通过调用isInterrupted()判断中断标志是否被置位来中断线程的执行。

wait()和sleep

1.sleep是Thread类的方法,是线程用来控制自身流程的;wait是Object类的方法,用来线程间的通信,这个方法会使当前拥有该对象锁的线程等待直到其他线程调用notify方法时再醒来,不过你也可以给他指定一个时间,自动醒来。这个方法主要是用走不同线程之间的调度的。

2.调用某个对象的wait()方法,相当于让当前线程交出此对象的锁,然后进入等待状态,等待后续再次获得此对象的锁;Thread类中的sleep方法使当前线程暂停执行一段时间,从而让其他线程有机会继续执行,但它并不释放对象锁;

调用sleep方法不会释放锁,调用wait方法会释放当前线程的锁(其实线程间的通信是靠对象来管理的,所有操作一个对象的线程是这个对象通过自己的wait方法来管理的,就好像这个对象是电视机,三个人是三个线程,那么电视机的遥控器就是这个锁,假如现在A拿着遥控器,电视机调用wait方法,那么A就交出自己的遥控器,由jVM虚拟机调度,遥控器该交给谁。)

wait()、notify()和notifyAll()方法

利用wait()来让一个线程在某些条件下暂停运行。例如,在生产者消费者模型中,生产者线程在缓冲区为满的时候,消费者在缓冲区为空的时候,都应该暂停运行。如果某些线程在等待某些条件触发,那当那些条件为真时,你可以用 notify 和 notifyAll 来通知那些等待中的线程重新开始运行。

wait应该永远在被synchronized的背景下和那个被多线程共享的对象上调用

用wait和notify解决生产者消费者问题。对在多线程间共享的那个Object来使用wait。在生产者消费者问题中,这个共享的Object就是那个缓冲区队列。希望上锁的对象就应该被synchronized,即那个在多个线程间被共享的对象。在生产者消费者问题中,应该被synchronized的就是那个缓冲区队列。

相关文章

  • # [Java学习]1.Java基础【学习笔记】

    [Java学习]1.Java基础【学习笔记】 书籍 《Java核心技术》、《Java核心技术精讲》 2018-09...

  • Java学习笔记(一)

    Java学习笔记(一) 依据《写给大忙人看的Java核心技术》所记笔记 【美】Cay S.Horstmann 著杨...

  • Java技术笔记

    本期是Java知识点最后一期,更多知识可咨询科多大数据领取视频观看。 线程共有5中状态:新建、可运行(runnab...

  • 终于来了!阿里技术官耗时半年纯手写1046页Java架构师笔记上

    阿里技术官耗时半年纯手写1046页Java架构师笔记上线!! 这份Java架构师笔记内容由浅入深,循序渐进,通过5...

  • 【专题】Java技术体系

    这是《深入理解Java虚拟机》的读书笔记。 1、Java技术体系 Java程序设计语言 各硬件平台上的Java虚拟...

  • JavaWeb 相关笔记

    《JavaWeb 相关笔记》 JSP/Servlet 及相关技术 JSP(Java Server Page)就是S...

  • java class文件结构

    (<深入分析Java Web技术内幕>笔记)java语言在宣传时打出的名号就是"一次编译,到处运行", 也就是支持...

  • JAVA并发相关知识

    看了java核心技术 卷1的第14章《并发》,在此做点笔记,供以后复习。 线程睡眠函数(java.lang.Thr...

  • 1.Java概述

    Java概述 技术体系 Java技术体系技术体系说明Java SE(Java Standard Edition):...

  • Java基础知识干货

    这个是我个人阅读《Java核心技术》和《Java编程思想》总结出来的笔记,清晰明了,但是没有细致讲解,如果碰到疑惑...

网友评论

      本文标题:Java技术笔记

      本文链接:https://www.haomeiwen.com/subject/wprxtqtx.html