Java Thread类的yield()和join()的区别和用法
2014-11-24 14:53
801 查看
yield:
解释它之前,先简述下,多线程的执行流程:多个线程并发请求执行时,由cpu决定优先执行哪一个,即使通过thread.setPriority(),设置了
线程的优先级,也不一定就是每次都先执行它
yield,表示暂停当前线程,执行其他线程(包括自身线程) 由cpu决定
[java] view
plaincopyprint?
public class TestYield implements Runnable {
public void run() {
for (int i = 1; i <= 15; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i);
// 暂停当前正在执行的线程对象,并执行其他线程,就是进入就绪状态
Thread.currentThread().yield();
// 可能还会执行本线程,
}
}
public static void main(String[] args) {
TestYield runnable = new TestYield();
Thread t1 = new Thread(runnable );
Thread t2 = new Thread(runnable );
Thread t3 = new Thread(runnable );
t2.setPriority(t2.getPriority() + 1);
t1.start();
t2.start();
t3.start();
}
}
join:
阻塞所在线程,等调用它的线程执行完毕,再向下执行
[java] view
plaincopyprint?
public static void main(String[] args) throws InterruptedException {
final Thread thread1 = new Thread() {
public void run() {
System.out.println("我是第一个");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我虽然睡了一会,但我是第二个");
};
};
thread1.start();
//在这阻塞主线程
Thread thread2 = new Thread() {
public void run() {
try {
thread1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}// 等待t1线程 执行完结,才继续向下执行 在这阻塞子线程
System.out.println("我是第三个");
};
};
thread2.start();
}
解释它之前,先简述下,多线程的执行流程:多个线程并发请求执行时,由cpu决定优先执行哪一个,即使通过thread.setPriority(),设置了
线程的优先级,也不一定就是每次都先执行它
yield,表示暂停当前线程,执行其他线程(包括自身线程) 由cpu决定
[java] view
plaincopyprint?
public class TestYield implements Runnable {
public void run() {
for (int i = 1; i <= 15; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i);
// 暂停当前正在执行的线程对象,并执行其他线程,就是进入就绪状态
Thread.currentThread().yield();
// 可能还会执行本线程,
}
}
public static void main(String[] args) {
TestYield runnable = new TestYield();
Thread t1 = new Thread(runnable );
Thread t2 = new Thread(runnable );
Thread t3 = new Thread(runnable );
t2.setPriority(t2.getPriority() + 1);
t1.start();
t2.start();
t3.start();
}
}
join:
阻塞所在线程,等调用它的线程执行完毕,再向下执行
[java] view
plaincopyprint?
public static void main(String[] args) throws InterruptedException {
final Thread thread1 = new Thread() {
public void run() {
System.out.println("我是第一个");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我虽然睡了一会,但我是第二个");
};
};
thread1.start();
//在这阻塞主线程
Thread thread2 = new Thread() {
public void run() {
try {
thread1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}// 等待t1线程 执行完结,才继续向下执行 在这阻塞子线程
System.out.println("我是第三个");
};
};
thread2.start();
}
相关文章推荐
- Java Thread类的yield()和join()的区别和用法
- Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别
- Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别
- Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别
- Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别
- Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别
- Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别
- Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别
- Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别
- Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别
- Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别
- Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别
- Java之Thread线程相关yield()、sleep()、wait()、join()、run和start区别详解
- java之Thread线程相关yield()、sleep()、wait()、join()、run和start区别详解
- java中join(),yield(),sleep()以及wait()的区别(转)
- Java Thread join() 的用法
- java中sleep和join和yield和wait和notify的区别
- sleep() wait() yield() join()用法与区别
- Java Thread Join的用法
- [Java] Thread-01 sleep-join-yield