java线程操作 sleep wait start wait 等
来源:互联网 发布:oracle导入数据库 编辑:程序博客网 时间:2024/06/07 20:36
(一)1.sleep()
睡眠:线程进入睡眠的时候,就会让出cpu的使用,其他线程就有机会被执行,但是值得注意的是,sleep不会让线程让出对象锁,所以,对于synchronized的函数或者代码块来说,就算当前线程是sleep状态,其他也不能执行。
public void run() {
Thread.sleep(123);
} catch (InterruptedException e) {
e.printStackTrace();
}
4.sleep不会让线程让出对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。
1、这两个方法来自不同的类,sleep()是Thread,wait()是Object
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)
synchronized(x){
x.notify()
//或者wait()
}
4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
5.wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生
InterruptedException,效果以及处理方式同sleep()方法
(二) 线程的中断
以前使用stop来中断线程,现在的jdk已经不支持了,提倡,在run函数中用无限循环 ,然后用布尔值来标记循环的停止。
如:
public void run (){
boolean b = false;
while(true){
//...
if(b){
break;
}
}
}
如果线程是用sleep和wait 进入到就绪状态的话, 可以是用interrupt 函数 使得线程离开run函数, 同时 结束线程, 但是会抛出InterruptedException
为了更好地理解interrupt()效果,我们来看一下下面这个例子:
- public class InterruptTest {
- public static void main(String[] args) {
- Thread t = new Thread() {
- public void run() {
- try {
- System.out.println("我被执行了-在sleep()方法前");
- // 停止运行10分钟
- Thread.sleep(1000 * 60 * 60 * 10);
- System.out.println("我被执行了-在sleep()方法后");
- } catch (InterruptedException e) {
- System.out.println("我被执行了-在catch语句块中");
- }
- System.out.println("我被执行了-在try{}语句块后");
- }
- };
- // 启动线程
- t.start();
- // 在sleep()结束前中断它
- t.interrupt();
- }
- }
运行结果:
- 我被执行了-在sleep()方法前
- 我被执行了-在catch语句块中
- 我被执行了-在try{}语句块后
(三)线程的优先级和线程让步yield()
线程可以具有的最高优先级。
static int MIN_PRIORITY
线程可以具有的最低优先级。
static int NORM_PRIORITY
分配给线程的默认优先级。
t.setPriority(8);
t.start();
在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。
写一个简单的例子来看一下join()的用法:
1.AThread 类
2.BThread类
3.TestDemo 类
class BThread extends Thread { public BThread() { super("[BThread] Thread"); }; public void run() { String threadName = Thread.currentThread().getName(); System.out.println(threadName + " start."); try { for (int i = 0; i < 5; i++) { System.out.println(threadName + " loop at " + i); Thread.sleep(1000); } System.out.println(threadName + " end."); } catch (Exception e) { System.out.println("Exception from " + threadName + ".run"); } }}class AThread extends Thread { BThread bt; public AThread(BThread bt) { super("[AThread] Thread"); this.bt = bt; } public void run() { String threadName = Thread.currentThread().getName(); System.out.println(threadName + " start."); try { bt.join(); System.out.println(threadName + " end."); } catch (Exception e) { System.out.println("Exception from " + threadName + ".run"); } }}public class TestDemo { public static void main(String[] args) { String threadName = Thread.currentThread().getName(); System.out.println(threadName + " start."); BThread bt = new BThread(); AThread at = new AThread(bt); try { bt.start(); Thread.sleep(2000); at.start(); at.join(); } catch (Exception e) { System.out.println("Exception from main"); } System.out.println(threadName + " end!"); }}
打印结果:
main start. //主线程起动,因为调用了at.join(),要等到at结束了,此线程才能向下执行。 [BThread] Thread start. [BThread] Thread loop at 0 [BThread] Thread loop at 1 [AThread] Thread start. //线程at启动,因为调用bt.join(),等到bt结束了才向下执行。 [BThread] Thread loop at 2 [BThread] Thread loop at 3 [BThread] Thread loop at 4 [BThread] Thread end. [AThread] Thread end. // 线程AThread在bt.join();阻塞处起动,向下继续执行的结果 main end! //线程AThread结束,此线程在at.join();阻塞处起动,向下继续执行的结果。
- java线程操作 sleep wait start wait 等
- java线程、锁、sleep、wait
- Java线程wait和sleep
- java之yield(),sleep(),wait()等区别
- 线程wait sleep
- 线程wait和sleep
- java线程 sleep()和wait()的区别
- java线程wait与sleep的区别
- java线程的sleep(),wait(),notify(),yield();
- java线程中wait()和sleep()区别
- JAVA线程wait, notify, sleep详解
- JAVA -- 线程wait()和sleep()的区别
- Java 线程 sleep wait 深入解析 Thread
- java线程sleep()和wait()的区别
- Java 线程中的Join、wait、notify,sleep
- JAVA之多线程yield(),sleep(),wait()区别
- java线程yield(),sleep(),wait()区别
- Java线程中的wait(),notify()与sleep()
- 编程练习3 1010
- hdoj2099整除的尾数(数学)
- 实习记录(一)
- JamesMusic浅读--------6,补全欢迎界面,音乐文件数据库
- hibernate+struts2学生信息管理系统简单整合
- java线程操作 sleep wait start wait 等
- poj1163The Triangle(DP)
- hdu2005第几天?
- JAVA 继承、方法重写、多态学习笔记
- 新闻发布网页-1
- 天梯匹配系统 - 简单实现
- S6720 核心交换配置实战
- android开发那些事儿(五)-通用流行框架大全
- CodeForces 659A Round House