上篇博客简单了介绍了Java的多线程的概念,与进程的区别,两种创建方式,状态及获取线程名称等内容。这篇文章接着介绍Java的多线程。主要从一下几方面介绍。

1 线程类的常用方法

1.1 start()

启动线程执行run方法

1.2 Thread.sleep()/sleep(long millis)

当前线程睡眠/millis的时间(millis指定睡眠时间是其最小的不执行时间,因为sleep(millis)休眠到达后,无法保证会被JVM立即调度);

sleep()是一个静态方法(static method) ,所以他不会停止其他的线程也处于休眠状态;线程sleep()时不会失去拥有的对象锁。

作用:保持对象锁,让出CPU,调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留一定的时间给其他线程执行的机会。

1.3 Thread.yield()

让出CPU的使用权,给其他线程执行机会、让同等优先权的线程运行(但并不保证当前线程会被JVM再次调度、使该线程重新进入Running状态),如果没有同等优先权的线程,那么yield()方法将不会起作用。

1.4  Thread.join()

强制执行该线程,该线程执行期间,其他线程无法运行,必须等该线程执行完毕后,才能执行其他线程。

1.5  object.wait()

使线程进入到等待池(Waiting Pool)中,同时失去了对象的机锁---暂时的,wait后还要返还对象锁。当前线程必须拥有当前对象的锁,如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常,所以wait()必须在synchronized block中调用。

1.6 Object.notify()/notifyAll()

唤醒在当前对象等待池中等待的第一个线程/所有线程。notify()/notifyAll()也必须拥有相同对象锁,否则也会抛出IllegalMonitorStateException异常。

1.7Object.wait()和Thread.sleep(long)的区别

1.sleep()方法

sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会。
sleep()是Thread类的Static(静态)的方法;因此他不能改变对象的机锁,所以当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,但是对象的机锁并木有被释放,其他线程无法访问这个对象(即使睡着也持有对象锁)。
在sleep()休眠时间期满后,该线程不一定会立即执行,这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。

2. wait()方法
wait()方法是Object类里的方法;当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout)超时时间到后还需要返还对象锁),其他线程可以访问。
wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程。
wiat()必须放在synchronized block中,否则会在program runtime时扔出"java.lang.IllegalMonitorStateException"异常。

 
总结一下:

sleep()睡眠时,保持对象锁,仍然占有该锁。

wait()睡眠时,释放对象锁。

2 线程的终止

3 线程的同步问题

参考:

Java多线程看我这一篇就足够了

java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)

Java Thread 总结

最新文章

  1. 虚拟化平台cloudstack(5)——参考资料
  2. Makefile-入门与进阶【转】
  3. 【总结】我所整理的float, inline-block还有position:absolute
  4. wget进行整站下载
  5. 关于C语言静态链接的个人理解,欢迎指正
  6. 微信小程序之获取当前位置经纬度以及地图显示
  7. vue2.0+ 从插件开发到npm发布
  8. vis.js没有中文文档,个人在项目中总结的一些中文配置
  9. 当页面是动态时 如果后台存储id可以通过查询后台方式获取对象;当后台没有存储时候 只有通过前端标记了 例如标记数量为10 我们根据传递过来的10循环取值
  10. BZOJ2342[Shoi2011]双倍回文——回文自动机
  11. A1136. Delayed Palindrome
  12. [nginx] load balancing & location
  13. [Hive_2] Hive 的安装&配置
  14. Redis和数据库 数据同步问题
  15. Hibernate的七种映射关系之七种关联映射(二)
  16. HDU 4720 Naive and Silly Muggles 平面几何
  17. java之面向对象三大特征(封装,继承,多态)
  18. django之中间件、缓存、信号、admin内置后台
  19. mysql oracle计算两点之间的距离
  20. A+B 输入输出练习I

热门文章

  1. c# HttpWebResponse 调用WebApi
  2. Oracle存储过程使用总结
  3. NOIP 2008 立体图 (字符串+模拟)
  4. 微信小程序生成太阳码
  5. 0003-程序流程1之app.js
  6. spring-cloud配置ribbon负载均衡
  7. git commit 提交的时候,出现*** Please tell me who you are. git config --global 。。。问题
  8. GridView导出成Excel字符"0"丢失/数字丢失的处理方式 收藏
  9. 【原】Zookeeper 概述 + 官网 Overview 翻译
  10. 在java中RandomAccessFile类的作用:对指定文件可以进行读写的操作