您的位置:首页 > 编程语言 > Java开发

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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐