java多线程2:控制线程方法

java多线程二:控制线程方法

join线程:
1、Thread线程提供了让一个线程等待另外一个线程执行完成的方法:join方法。当某个正在执行的线程A调用了B线程的join()方法时,那么A线程将会被阻塞,知道B线程执行完成为止才会可能执行。
2、join有三种重载形式:
  join():等待被join的线程执行完成。
  join(long mills):等待被join的线程的最长时间为mills毫秒,如果在mills毫秒内,被join的线程还没有执行完成则不再等待。

package com.yt.manager.thread;

/**
 * join()线程
 * 
 * @author zxf 让一个线程等待另外一个线程执行完成的方法
 */
public class JoinThread extends Thread {

	public JoinThread(String name) {
		super(name);
	}

	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println(getName() + "  " + i);
		}

	}

	public static void main(String[] args) throws InterruptedException {
		for (int i = 0; i < 100; i++) {
			if (i == 20) {
				JoinThread joinThread = new JoinThread("被join的线程");
				joinThread.start();
				// main线程调用了joinThread线程的join()方法, main线程必须等
				// joinThread线程执行结束后才会向下执行。
				joinThread.join();
			}
			System.out.println(Thread.currentThread().getName() + "  " + i);
		}
	}
}

 线程睡眠Sleep:
1、如果我们需要将当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以调用Thread类的静态方法sleep(long millis)。当当前线程调用sleep方法进入阻塞状态后,在其sleep时间内,该线程不会获得任何执行的机会,即使系统中没有其它正在运行的线程,处于sleep的线程
也不会运行,因此sleep方法常用来暂停程序的执行。

package com.yt.manager.thread;
/**
 * 线程睡眠sleep
 * @author zxf
 *
 */
public class SleepThread {

	public static void main(String[] args) throws InterruptedException {
		for (int i = 0; i < 10; i++) {
			System.out.println(i);
			Thread.sleep(5000);
		}
	}
}

 线程让步:
1、它可以让当前正在执行的线程暂停,但不会阻塞线程,它只是将该线程转入就绪状态,yield()方法只是让线程调度器重新调度一次。完全有可能的情况是,当某个线程调用了yield()方法暂停之后,线程调度器又将其调度起来重新执行。实际上当某个线程调用了yield()方法暂停后,只有优先级与当前线程相同,或者优先级比当前线程高的线程才有可能获得执行的机会。

package com.yt.manager.thread;

/**
 * 线程让步
 * 
 * @author zxf
 * 
 */
public class YieldThread extends Thread {

	public YieldThread(String name) {
		super(name);
	}
	
	@Override
	public void run() {
		for(int i=0;i<100;i++){
			System.out.println(getName()+"  "+i);
			//当i==20时,让当前线程做出让步
			if(i==21){
				Thread.yield();
			}
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		YieldThread y1 = new YieldThread("高级");
		//y1.setPriority(Thread.MAX_PRIORITY);
		y1.start();
		
		YieldThread y2 = new YieldThread("低级");
		//y2.setPriority(Thread.MIN_PRIORITY);
		y2.start();

	}

}