【java】【多线程】睡眠/守护/加入/礼让线程,线程优先级(4)

一、休眠线程--sleep()

Thread.sleep(毫秒,纳秒):控制当前线程休眠若干毫秒,遇到就会睡着时间到了就会自动醒来继续执行

静态方法:类名.方法调用

    注意:1秒= 1000毫秒,1秒 = 1000 * 1000 * 1000=1000000000纳秒,因此windows系统对纳秒的支持不够好,因此用毫秒。

  • 若在主线程中使用sleep(),则会中断异常,需抛出。
  • 若使用Thread或者Runable创建线程,因为父类的run方法中没有出现异常,因此子类里也不运行出现异常直接抛出,而是需要自己捕获进行处理try-catch
new Thread() {
    public void run() {
	for(int i = 0; i < 10; i++) {
		System.out.println(getName() + "...aa");
		try {        
		    Thread.sleep(10);
		} catch (InterruptedException e) {
		    e.printStackTrace();
		    }
		}
	}
}.start();


二、守护线程

setDaemon(boolean):设置一个线程为守护线程, 该线程不会单独执行, 当其他非守护线程都执行结束后, 自动退出

解释:任何一个守护线程都是整个JVM中所有非守护线程的保姆:

  • 只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
  • Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。
Thread t1 = new Thread() {
	public void run() {
		for(int i = 0; i < 50; i++) {
			System.out.println(getName() + "...aaaaaaaaaaaaaaaaaaaaaa");
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
};			
Thread t2 = new Thread() {
	public void run() {
		for(int i = 0; i < 5; i++) {
			System.out.println(getName() + "...bb");
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
};
			
t1.setDaemon(true);	//将t1设置为守护线程,只要t2执行完毕,t1就不会再执行		
t1.start();
t2.start();


三、加入线程

Thread. join():当前线程暂停, 等待指定的线程执行结束后, 当前线程再继续 。插队操作。

注意:匿名内部类在使用所在方法中的局部变量时,必须用final修饰。

final Thread t1 = new Thread() {
    public void run() {
        for(int i = 0; i < 50; i++) {
		System.out.println(getName() + "...aaaaaaaaaaaaaaaaaaaaaa");
		try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
    }
};		
Thread t2 = new Thread() {
    public void run() {
	for(int i = 0; i < 50; i++) {
	    if(i == 2) {
	        try {
		    //t1.join();		//插队,加入,当i=2时,t1加入线程,等t1全部执行完毕时再返回t2继续执行
		    t1.join(30);		//加入,有固定的时间,t1执行30毫秒后,返回此处,t1和t2继续交替执行
	        } catch (InterruptedException e) {					
		    e.printStackTrace();
	        }
            }
	System.out.println(getName() + "...bb");				
	}
    }
};			
t1.start();
t2.start();


四、礼让线程

yield:让出cpu,理论上是让出CPU去处理其他线程,但是效果特别不明显


五、设置线程的优先级

* setPriority():设置线程的优先级,1~10, 效果也不是很明显

    MIN_PRIORITY = 1;   最低优先级

    NORM_PRIORITY = 5;  默认优先级

    MAX_PRIORITY = 10;  最高优先级






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值