java多线程的操作
上篇博客简单了介绍了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多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)
最新文章
- 虚拟化平台cloudstack(5)——参考资料
- Makefile-入门与进阶【转】
- 【总结】我所整理的float, inline-block还有position:absolute
- wget进行整站下载
- 关于C语言静态链接的个人理解,欢迎指正
- 微信小程序之获取当前位置经纬度以及地图显示
- vue2.0+ 从插件开发到npm发布
- vis.js没有中文文档,个人在项目中总结的一些中文配置
- 当页面是动态时 如果后台存储id可以通过查询后台方式获取对象;当后台没有存储时候 只有通过前端标记了 例如标记数量为10 我们根据传递过来的10循环取值
- BZOJ2342[Shoi2011]双倍回文——回文自动机
- A1136. Delayed Palindrome
- [nginx] load balancing &; location
- [Hive_2] Hive 的安装&;配置
- Redis和数据库 数据同步问题
- Hibernate的七种映射关系之七种关联映射(二)
- HDU 4720 Naive and Silly Muggles 平面几何
- java之面向对象三大特征(封装,继承,多态)
- django之中间件、缓存、信号、admin内置后台
- mysql oracle计算两点之间的距离
- A+B 输入输出练习I
热门文章
- c# HttpWebResponse 调用WebApi
- Oracle存储过程使用总结
- NOIP 2008 立体图 (字符串+模拟)
- 微信小程序生成太阳码
- 0003-程序流程1之app.js
- spring-cloud配置ribbon负载均衡
- git commit 提交的时候,出现*** Please tell me who you are. git config --global 。。。问题
- GridView导出成Excel字符";0";丢失/数字丢失的处理方式 收藏
- 【原】Zookeeper 概述 + 官网 Overview 翻译
- 在java中RandomAccessFile类的作用:对指定文件可以进行读写的操作