线程的优先级与join方法

来源:互联网 发布:梦幻西游mac版好不好用 编辑:程序博客网 时间:2024/05/29 19:58

优先级:

线程的优先级将该线程的重要性传递给了调度器。尽管CPU处理现有线程集的顺序是不确定的,但是调度器将倾向于让优先级最高的线程先执行。但是这也并不是意味着优先权较低的线程将得不到执行(优先权不会出现死锁),优先级较低的线程仅仅是执行的频率较低。在java中,线程的优先级用1-10种数字表示,其中数字越大,表示优先级越高,默认的线程的优先级为5。尽管JDK设置了10个优先级,但是它与多数操作系统都不能很好的映射。所以建议使用的设置优先级为MAX_PRIORITY、MIN_PRIORITY、NORM_PRIORITY。

优先级的代码示例如下:

package basic;public class SimplePrioritis implements Runnable{private int priority;public SimplePrioritis(int priority){this.priority = priority;}@Overridepublic void run() {Thread.currentThread().setPriority(priority);for(int i=0; i<5; i++){System.out.println(Thread.currentThread().getName()+"正在运行...");//说明你的工作已经完成,将cpu来处具有相同的优先级的其它线程Thread.yield();}}public static void main(String[] args) {Thread t1 = new Thread(new  SimplePrioritis(Thread.MAX_PRIORITY));Thread t2 = new Thread(new  SimplePrioritis(Thread.MIN_PRIORITY));t1.start();t2.start();}}
join()方法:

一个线程可以在其它线程上调用join()方法,其效果是等待一段时间,直到第二个线程结束才继续执行。但是对于join()方法的调用也可以被中断,做法是调用线程上的interrupt()方法。例如,线程B在线程A中使用了join()方法,那么线程线程A就会等待线程B执行完之后在执行。

t.join()使t线程执行完了之后,在执行主线程。

t.join(time);使主线程等待time毫秒,不论t线程是否执行完毕,都将执行主线程的内容。

具体代码示例如下:

测试t.join()

package join;/** * 主线程开始执行System.out.println(a)的时候,线程或许还没有执行,或许还在为 * 该线程分配资源,所以当执行start()之后,就直接执行了System.out.println(a), * 所以输出的结果为0。使用了t.join()方法之后,他可以是调用该线程的方法在该线程执行之后运行。 * @author Administrator * */public class JoinTest implements Runnable {private static int a = 0;@Overridepublic void run() {try {a = a + 1;Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}public static void main(String[] args) {Thread t = new Thread(new JoinTest());t.start();try {//如果不加t.join()则输出的结果为0t.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(a);}}

测试t.join(time)

package join;public class RunnableImpl1 implements Runnable {@Overridepublic void run() {try {System.out.println("begin sleep");//TimeUnit.MICROSECONDS.sleep(100000);Thread.sleep(10000);System.out.println("end sleep");} catch (Exception e) {System.out.println(Thread.currentThread().getName()+" is Interrupted"+Thread.interrupted());}}}

package join;/** * t.join(1000)即为main()会等待1000毫秒,不论线程t是否结束,都会在1000秒之后 * 执行main方法中的函数,若是要让t线程强制中断,那么就执行t.interrupt()函数。 * @author Administrator */public class JoinTest1 {public static void main(String[] args) {Thread t = new Thread(new RunnableImpl1());t.start();try {t.join(1000);//interrupt()会在1000毫秒过后使主线程执行完毕之后,//t线程即使没有执行完成也会强制结束。t.interrupt();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("finish sleep");}}


0 0
原创粉丝点击