关闭

线程常用的方法

205人阅读 评论(0) 收藏 举报

 

join()——让一个线程等待另一个线程的方法

 

当某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的join线程执行完为止。

join():等待被join的线程执行完成

join(long millis)::等待被join的线程的时间最长为millis毫秒。如果在millis毫秒内被join的线程还没有执行结束,则不再等待。

public class MyRunner3 extends Thread {
	@Override
	public void run() {
		for(int i = 0; i < 5; i++){
			System.out.println("i am " + getName());
			try {
				sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

 

public class TestThread3 {
	public static void main(String[] args) {
		Thread thread = new MyRunner3();
		thread.start();
		try {
			//主线程等待thread的业务处理完了之后再向下运行
			//thread和主线程合并了
			thread.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		for(int i = 0; i < 100; i++){
			System.out.println("main : " + i);
		}
	}
}

 

线程睡眠:sleep

 

如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态sleep()方法来实现。

当当前线程调用sleep()方法进入阻塞状态后,在其睡眠时间内,该线程不会获得执行机会,即使系统中没有其他可执行线程,处于sleep()中的线程也不会执行,因此sleep()方法常用来暂停程序的执行

public class ThreadSleepDemo {
	public static void main(String[] args) throws InterruptedException {
		for(int i=0; i < 10; i++){
			System.out.println(Thread.currentThread().getName());
			Thread.sleep(1000);
		}
	}
}

 

线程让步:yield

 

yield()方法和sleep()方法有点相似,它也是Thread类提供的一个静态方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程转入到就绪状态。即让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:当某个线程调用了yield()方法暂停之后,线程调度器又将其调度出来重新执行。

实际上,当某个线程调用了yield()方法之后,只有优先级与当前线程相同或者比当前线程更高的处于就绪状态的线程才会获得执行机会。

public class MyRunner4 extends Thread {
	@Override
	public void run() {
		for(int i = 0; i < 100; i++){
			System.out.println(getName() + " : " + i);
			if(i%10 == 0){
				System.out.println("ok");
				yield();
			}
		}
	}
}

 

public class TestThread4 {
	public static void main(String[] args) {
		Thread t1 = new MyRunner4();
		Thread t2 = new MyRunner4();
		t1.start();
		t2.start();
	}
}

 

 sleep()与yield()方法区别:

1、sleep()方法暂停当前线程后,会给其他线程执行机会,不会理会其他线程的优先级;但yield()方法只会给优先级高或者相同的线程机会

2、sleep()方法会将线程转入到阻塞状态,知道经过阻塞时间才会转入就绪状态;而yield()不会将线程转入阻塞状态,它只是强制当前线程进入就绪状态。因此完全有可能某个线程调用了yield()方法暂停之后,立即再次获取处理器资源被执行。

3、sleep()方法声明抛出InterruptedException异常,所以嗲用sleep()方法时要么捕捉该异常,要么显示声明抛出该异常;而yield()方法则没有声明抛出任何异常。

4、sleep()方法比yield()方法更好的可移植性,通常不建议使用yield()方法来控制并发线程执行。

 

改变线程的优先级

 

线程的优先级用数字表示,范围从1到10,默认的是为5

优先级设置高了之后,获取CPU运行时间片要多一些,具体执行多少时间由操作系统决定

每个线程默认的优先级与创建它的父线程的优先级相同,在默认情况下,main线程具有普通优先级,由main线程创建的子线程也具有普通优先级

public class MyRunner5 extends Thread {
	@Override
	public void run() {
		for(int i = 0; i < 1000; i++){
			System.out.println(getName() + " : " + i);
		}
	}
}

 

public class TestThread5 {
	public static void main(String[] args) {
		Thread t1 = new MyRunner5();
		Thread t2 = new MyRunner5();
		t2.setPriority(Thread.NORM_PRIORITY+3);
		t1.start();
		t2.start();
	}
}

 

 

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:279705次
    • 积分:8430
    • 等级:
    • 排名:第2295名
    • 原创:1096篇
    • 转载:14篇
    • 译文:0篇
    • 评论:4条
    最新评论