Java 线程的一些问题

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


猜你喜欢

转载自blog.csdn.net/kekekeqi/article/details/80624115