线程让步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("主线程完成!");
}
}