Java线程小结(一)

来源:互联网 发布:ipad 录屏软件 编辑:程序博客网 时间:2024/05/16 04:48

一、join()方法
等待被join的线程执行完成。
join(long millis)方法
等join的新车的时间最长为minllis毫秒,如果在millis毫秒内被join的线程还没有执行结束,则不再等待。
join(long millis ,int nanos)方法
等待被join的时机最长为millis毫秒加nanos纳秒。

案例:

package com.xiaomo.thread;public class JoinThread extends Thread {// 提供一个有参数的构造器,用于设置该线程的名字public JoinThread(String name) {super(name);}// 重写run方法,定义线程执行体public void run() {for (int i = 0; i < 100; i++) {System.out.println(getName() + " " + i);}}public static void main(String[] args) throws Exception {//启动子线程new JoinThread("新线程").start();for (int i = 0; i < 100; i++) {if (i == 20) {JoinThread jt = new JoinThread("被Join的线程");jt.start();// main线程调用了jt线程的join方法,main线程必须等jt执行结束才会向下执行jt.join();}System.out.println(Thread.currentThread().getName() + " " + i);}}}

二、setPriority()和方法:
来设值和取值,
返回线程的优先级,其中setPriority可以是个整数,范围是一到十之间,也可以是MAX_PRIORITY ,MIN_PRIORITY ,NORM_PRIORITY 三个静态常量。
getPriority()方法
返回线程的优先级。每个线程执行时,都具有一定的优先级,优先级高的线程获得较多的执行机会,而优先级低的线程则获得较小的执行机会。

案例:

package com.xiaomo.thread;public class PriorityThread extends Thread {// 定义一个有参数的构造器,用于创建线程时指定namepublic PriorityThread(String name) {super(name);}public void run() {for (int i = 0; i < 50; i++) {System.out.println(getName() + ",其优先级是: " + getPriority()+ ",循环变量的值为:" + i);}}public static void main(String[] args) {// 改变主线程的优先级Thread.currentThread().setPriority(6);for (int i = 0; i < 30; i++) {if (i == 10) {PriorityThread low = new PriorityThread("低级");low.start();System.out.println("创建之初的优先级:" + low.getPriority());// 设置该线程为最低优先级low.setPriority(Thread.MIN_PRIORITY);}if (i == 20) {PriorityThread high = new PriorityThread("高级");high.start();System.out.println("创建之初的优先级:" + high.getPriority());// 设置该线程为最高优先级high.setPriority(Thread.MAX_PRIORITY);}}}}

三、后台线程(DaemonThread)
有一种线程它是在后台运行的,它的任务是为其他线程提供服务,这种线程称为后台线程,又称为守护线程,又称为精灵线程。JVM的垃圾回收线程就是典型的后台线程。后台线程有个特征:如果所有的前台线程都死亡,后台线程会自动死亡。调用Thread对象的setDaemon(blooean on)方法(参数传true),可将指定线程设置为后台线程,isDaemon()判断该线程是否为后台线程,如果该线程是守护线程,则返回 true;否则返回false。

sleep(long millis)方法(线程睡眠)
让当前正在执行的线程暂停并进入阻塞状态,该方法受到系统计时器和线程调度器的精度和准确度的影响。

注:
当前线程调用sleep方法,进入阻塞状态后,在sleep时间段内,该线程不会获得执行的机会,即使系统中没有其他可运行的线程,处于sleep时间段里的线程也不会运行。因此sleep常用来暂停程序的执行,

案例:

package com.xiaomo.thread;public class DaemonThread extends Thread {// 重写run方法,定义线程执行体public void run() {for (int i = 0; i < 10000; i++) {System.out.println(getName() + " " + i);}}public static void main(String[] args) throws InterruptedException {DaemonThread t = new DaemonThread();// 将此线程设置成后台线程(必须先设置再启动)t.setDaemon(true);// 启动后台线程t.start();for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName() + " " + i);}// ------程序执行到此处,前台线程(main线程)结束------// 后台线程也应该随之结束}}

四、yield()方法(线程让步)
yield方法和sleep有点相似的方法,让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程转入就绪状态,yield方法只是让当前线程暂停一下,让系统的线程调度器从新调度一次,当某个线程调用了yield方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的就绪状态的线程才会获得执行的机会

案例:

package com.xiaomo.thread;public class YieldThread extends Thread {public YieldThread(String name) {super(name);}// 定义run方法作为线程执行体public void run() {for (int i = 0; i < 100; i++) {System.out.println(getName() + " " + i);if (i == 20) {Thread.yield();}}}public static void main(String[] args) {// 启动两个并发线程YieldThread yt1 = new YieldThread("高级");// 将yt1线程设置成为最高优先级yt1.setPriority(Thread.MAX_PRIORITY);yt1.start();YieldThread yt2 = new YieldThread("低级");// 将yt2线程设置成为最低优先级yt2.setPriority(Thread.MIN_PRIORITY);yt2.start();}}

五、sleep方法和yield方法的区别
1,sleep方法暂停当前线程后,会给其他线程执行机会,不会理会其他线程的优先级,但yield方法只会给优先级相同或优先级更高的线程执行机会。
2,sleep方法会将线程转入阻塞状态,直到经过阻塞时间,才会转入就绪状态,而yield方法不会将线程转入阻塞状态,它只是强制当前线程进入就绪状态,因此完全有可能某个线程用yield方法暂停之后立即再次获得处理器资源被执行。
3,sleep方法声明抛出 InterruptedException 异常。所有调用sleep方法时,要么扑捉该异常,要么显示声明抛出该异常。而yield方法则没有声明抛出任何异常。
4,sleep方法比yield方法有更好的可移植性,通常不用依靠yield方法来控制并发线程的执行。

案例:

package com.xiaomo.thread;import java.util.Date;public class SleepThread {public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 10; i++) {System.out.println("当前时间:" + new Date() + "--->" + i);// 调用sleep方法让当前线程暂停1sThread.sleep(1000);}}}

出处:http://blog.csdn.net/cl05300629/article/details/13000371 作者:伫望碧落

原创粉丝点击