多线程(7)线程礼让yield,强制执行join,线程优先级,守护线程

一:线程礼让

①礼让线程,让当前正在执行的线程暂停,但不阻塞

②将线程从运行状态转为就绪状态

③让cpu重新调度,礼让不一定成功,看cpu

其实yield的作用就是让我们的运行时的线程转变为就绪状态的线程,和那些就绪的线程一起竞争

class  Yield implements Runnable{
	public static void main(String[] args) {
		Yield yield=new Yield();
		new Thread(yield,"zph").start();
		new Thread(yield,"wlw").start();
	}

	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+"开始了");
		Thread.yield();//谁先执行后,就礼让其它的线程,但是不一定成功
		System.out.println(Thread.currentThread().getName()+"结束了");
	}
}
wlw开始了
zph开始了
wlw结束了
zph结束了

 二:线程强制执行Join

①join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞

②可以理解为插队

class   Join implements Runnable{
	@Override
	public void run() {
		for (int i=0;i<100;i++){
			System.out.println(Thread.currentThread().getName()+i);
		}
	}
	public static void main(String[] args) throws InterruptedException {
		Thread thread=new Thread(new Join());
		thread.start();
		for (int j=0;j<1000;j++){
			if (j==800){
				thread.join();
			}
			System.out.println(Thread.currentThread().getName()+j);
		}
	}
}
如果我们的main线程先执行,那么当我们主线程执行到800次的时候,我们进行插队进行thread线程执行。

 三:线程的优先级

①java提供了一个线程调度器来监控程序启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度那个线程来执行。

②线程的优先级用数字表示,范围从1-10

Thread.MIN_PRIORITY=1;

Thread.MAX_PRIORITY=10;

③使用以下方式改变或获取优先级

getPriority(),setPriority(int i)

class  TestPriority implements Runnable{
	public static void main(String[] args) {
		TestPriority testPriority=new TestPriority();
        Thread thread=new Thread(testPriority,"zph");
		Thread thread1=new Thread(testPriority,"wlw");
		Thread thread2=new Thread(testPriority,"nyy");
		Thread thread3=new Thread(testPriority,"lzh");
		thread.setPriority(10);
		thread1.setPriority(5);
		thread2.setPriority(1);
		thread3.setPriority(8);
		thread.start();
		thread1.start();
		thread2.start();
		thread3.start();
	}
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+"---:"+Thread.currentThread().getPriority());
	}
}
并不是优先级高的一定先执行

 四:守护线程

①线程分为用户线程和守护线程

②虚拟机必须确保用户线程执行完毕

③虚拟机不用等待守护线程执行完毕

④如;后台记录操作日志,监控内存,垃圾回收等待

class  TestDaemon {
	public static void main(String[] args) {
        You1 you1=new You1();
        Tian tian=new Tian();
        Thread thread=new Thread(tian);
		thread.setDaemon(true);//将天设置为守护线程
		thread.start();  //启动线程启动
		new Thread(you1).start();//自己线程启动

	}
}
class You1 implements Runnable{
	@Override
	public void run() {
     for (int i=0;i<355;i++){
	   System.out.println("生活着:"+i);
     }
		System.out.println("我结束了");
	}
}
class Tian implements  Runnable{
	@Override
	public void run() {
    while (true){
		System.out.println("我是天");
	}
	}
}

 

posted @ 2021-04-30 11:59  iLisa  阅读(99)  评论(0编辑  收藏  举报