线程让步yield() 线程合并Join() 守护线程setDaemon(true)

线程让步yield()

yield()方法是 Thread类的一个静态方法,当前线程主动让出CPU资源,进入就绪状态,等待下次调度,给同级或更高优先级的线程被执行的机会。若线程都是低优先级的,则很有可能这个线程又调度,又进入运行状态。

public class YieldTest {

	static class TestThread extends Thread {
		public TestThread() {
		}
		//构造方法,传入线程名以及优先级
		public TestThread(String name, int pro) {
			super(name);
			//设置优先级
			this.setPriority(pro);
		}

		@Override
		//重写Run方法
		public void run() {
			for (int i = 0; i < 5; i++) {
				System.out.println(this.getName() + "线程第" + i + "次执行!");
				Thread.yield(); // 线程让步
			}
		}
	}
	//主方法
	public static void main(String[] args) {
		Thread t1 = new TestThread("sub1", 10);
		Thread t2 = new TestThread("sub2", 1);
		t1.start();
		t2.start();
	}
}

sleep()和yield()的区别:

1. sleep方法会使得当前线程进入阻塞状态,休眠完毕,就会进入就绪状态。而yield方法则会使当前线程直接进入就绪状态,可能刚进入就绪状态,又被调度到运行状态。

2. sleep方法会抛出 InterruptedException,而yield方法则没有声明抛出任何异常。

 
 

线程合并Join()

线程A在运行期间,可以调用线程B的join()方法,这样线程A就会等待线程B执行完毕后,才继续执行。

void join()
         等待该线程结束

void  join(long millis)
       等待该线程中止的最长时间为 millis 毫秒

void  join(long millis , int nanos)
       等待该线程中止的最长时间为 millis 毫秒 + nanos 纳秒

public class JoinTest {
	private static long sum1 = 0,sum2 = 0;
	
	// 子线程计算1+2+。。。。1000的累加和
	static class MyThread extends Thread {

		@Override
		public void run() {
			for (int i = 0; i <= 1000; i++) {
				try {
					Thread.sleep(5);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				sum1 += i;
			}
		}
	}
	// 子线程计算1+2+。。。。10000的累加和
	static class MyThread2 extends Thread {

		@Override
		public void run() {
			for (int i = 0; i <= 10000; i++) {
				try {
					Thread.sleep(5);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				sum2 += i;
			}
		}
	}

	public static void main(String[] args) {
		// 启动子线程进行计算
		MyThread mt = new MyThread();
		MyThread2 mt2 = new MyThread2();
		mt.start();
		mt2.start();
		// 等待子线程的结束
		try {
			mt.join();
			mt2.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("sum+sum1=" + (sum + sum1));
	}
}

 
  
 

守护线程setDaemon(true)

守护线程不能维持应用程序的存活。

setDaemon(true)方法必须在启动线程前调用,否则抛出IllegalThreadStateException异常

public class DaemonTest {

	static class MyThread extends Thread {

		@Override
		public void run() {
			for (int i = 0; i <= 100; i++) {
				try {
					Thread.sleep(20);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName() + "---->" + i);
			}
		}
	}

	public static void main(String[] args) {
		MyThread mt = new MyThread();
		// 将子线程设置为守护线程
		mt.setDaemon(true);
		mt.start();
		System.out.println("主线程完成!");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值