public class Theadtest {
public static void main(String[] args) {
MyTherd my = new MyTherd();
my.start();
}
}
class MyTherd extends Thread {
@Override
public void run() {
long open = System.currentTimeMillis();
int count = 0;
for(int i = 0; i <= 1000000; i++) {
count =count+i;
//Thread.yield();
}
long end = System.currentTimeMillis();
System.out.println("用时:"+(end-open)+"毫秒");
}
}
输出结果3毫秒
如果将注释取消在运行100毫秒
调用yield()方法是为了让当前线程交出CPU权限,让CPU执行其他线程。他和sleep()方法类似同样不会释放锁,但是yield不能控制具体交出CPU的时间。并且它只能让相同优先等级的线程获得CPU执行时间的机会。
调用yield不会让线程进入阻塞状态,而是进入了就绪状态。他只需等待重新获得CPU的时间。
join()
在很多情况下我们需要在子线程中执行大量的耗时任务,但是我们的主线程又必须等子线程执行完毕以后才能结束,这就需要用到join()方法了。join()方法是等待线程对象销毁,如果子线程执行了这个方法,那么主线程就要等待子线程执行完毕后才会销毁
public class Theadtest {
public static void main(String[] args) throws InterruptedException {
MyTherd my = new MyTherd("t1");
my.start();
for (int i = 0; i < 10; i++) {
if(i == 5) {
MyTherd m = new MyTherd("t2");
m.start();
//m.join();
}
System.out.println("main当前线程:"+Thread.currentThread().getName() +" "+i);
}
}
}
class MyTherd extends Thread {
public MyTherd(String name) {
super(name);
}
@Override
public void run() {
for(int i = 0; i <= 5; i++) {
System.out.println("当前线程"+Thread.currentThread().getName()+" "+i);
}
}
}
输出结果:
main当前线程:main 0
main当前线程:main 1
main当前线程:main 2
main当前线程:main 3
main当前线程:main 4
main当前线程:main 5
main当前线程:main 6
main当前线程:main 7
main当前线程:main 8
main当前线程:main 9
当前线程t1 0
当前线程t1 1
当前线程t1 2
当前线程t1 3
当前线程t1 4
当前线程t1 5
当前线程t2 0
当前线程t2 1
当前线程t2 2
当前线程t2 3
当前线程t2 4
当前线程t2 5
将Join方法打开
当前线程t1 0
main当前线程:main 0
当前线程t1 1
当前线程t1 2
main当前线程:main 1
当前线程t1 3
main当前线程:main 2
当前线程t1 4
main当前线程:main 3
当前线程t1 5
main当前线程:main 4
当前线程t2 0
当前线程t2 1
当前线程t2 2
当前线程t2 3
当前线程t2 4
当前线程t2 5
main当前线程:main 5
main当前线程:main 6
main当前线程:main 7
main当前线程:main 8
main当前线程:main 9
可以看到在使用了join以后,主线程会等待子线程结束后才会结束。