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以后,主线程会等待子线程结束后才会结束。