首页 > 代码库 > 多线程总结三:控制线程
多线程总结三:控制线程
Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好的控制线程的执行。
1、join线程:join
当某个程序执行流中调用其他线程的join()方法时,执行中的线程会被阻塞,直到被join()方法加入的join线程执行
完为止。join()方法将大问题划分为许多小问题,每个小问题分配一个线程,当所有的小问题都得到处理以后,再调用主
线程来进一步操作。
1 /** 2 * @Title: JoinThread.java 3 * @Package 4 * @author 任伟 5 * @date 2014-12-8 上午11:23:38 6 * @version V1.0 7 */ 8 9 /** 10 * @ClassName: JoinThread 11 * @Description: join线程12 * @author 任伟13 * @date 2014-12-8 上午11:23:38 14 */15 public class JoinThread extends Thread{16 17 //提供一个有参数的构造器,用于设置该线程的名字18 public JoinThread(String name){19 super(name);20 }21 22 /* (non-Javadoc)23 * @see java.lang.Thread#run()24 */25 @Override26 public void run() {27 for(int i=0; i<100; i++){28 System.out.println(this.getName() + " " + i);29 }30 }31 32 public static void main(String[] args) {33 //启动子线程34 new JoinThread("新线程").start();35 for(int i=0; i<100; i++){36 if(20==i){37 JoinThread jt = new JoinThread("被Join的线程");38 jt.start();39 try {40 jt.join();41 } catch (InterruptedException e) {42 e.printStackTrace();43 }44 }45 System.out.println(Thread.currentThread().getName()+" "+i);46 }47 }48 }
2、后台线程:setDaemon
后台线程又称为“守护线程”或“精灵线程”。其特征是:如果所有的前台线程都死亡,后台线程会自动死亡。调用Thread
对象的setDaemon(true)方法可以将指定的线程设置为后台线程。前台线程创建的子线程默认是前台线程,后台线程创建的子
线程默认是后台台线程。
1 /** 2 * @Title: DaemonThread.java 3 * @Package 4 * @author 任伟 5 * @date 2014-12-8 上午11:41:13 6 * @version V1.0 7 */ 8 9 /** 10 * @ClassName: DaemonThread 11 * @Description: 后台线程12 * @author 任伟13 * @date 2014-12-8 上午11:41:13 14 */15 public class DaemonThread extends Thread {16 /* (non-Javadoc)17 * @see java.lang.Thread#run()18 */19 @Override20 public void run() {21 for(int i=0; i<10000; i++){22 System.out.println(this.getName()+" "+i);23 }24 }25 26 public static void main(String[] args) {27 DaemonThread t = new DaemonThread();28 //将此线程设置为后台线程29 t.setDaemon(true);30 t.start();31 32 for(int i=0; i<10; i++){33 System.out.println(Thread.currentThread().getName()+" "+i);34 }35 }36 }
3、线程睡眠:Sleep
当当前线程调用sleep()方法进入阻塞状态以后,该线程不会获得执行的机会,因此sleep()方法常用来暂停程序的执行。
1 /** 2 * @Title: SleepTest.java 3 * @Package 4 * @author 任伟 5 * @date 2014-12-8 上午11:53:51 6 * @version V1.0 7 */ 8 9 /** 10 * @ClassName: SleepTest 11 * @Description: 使线程睡眠12 * @author 任伟13 * @date 2014-12-8 上午11:53:51 14 */15 public class SleepTest {16 public static void main(String[] args) {17 for(int i=0; i<10; i++){18 System.out.println("当前时间:" + new Date());19 try {20 Thread.sleep(1000);21 } catch (InterruptedException e) {22 e.printStackTrace();23 }24 }25 }26 }
4、线程优先级
每个线程执行时都会具有一定的优先级,每个线程默认的优先级都与创建它的父线程优先级相同。Thread类提供了
setPriority(int newPriority)、getPriority()来设置和返回线程优先级。
MAX_PRIORITY: 10
MIN_PRIORITY: 1
NORM_PRIORITY: 5
5、线程让步:yield
yield()让当前线程暂停一下,让系统的线程调度器重新调度一次,当然也可能调度到自己.
1 /** 2 * @Title: YieldTest.java 3 * @Package 4 * @author 任伟 5 * @date 2014-12-8 下午12:03:34 6 * @version V1.0 7 */ 8 9 /** 10 * @ClassName: YieldTest 11 * @Description: 线程让步方法测试12 * @author 任伟13 * @date 2014-12-8 下午12:03:34 14 */15 public class YieldTest extends Thread{16 17 public YieldTest(String name){18 super(name);19 }20 21 public void run() {22 for(int i=0; i<50; i++){23 System.out.println(this.getName()+" "+i);24 //当i=20,使用yield()方法让当前线程让步25 if(20==i){26 Thread.yield();27 }28 }29 }30 31 public static void main(String[] args) {32 YieldTest yt1 = new YieldTest("线程1");33 YieldTest yt2 = new YieldTest("线程2");34 yt1.setPriority(Thread.MAX_PRIORITY);35 yt2.setPriority(Thread.MIN_PRIORITY);36 37 38 yt1.start();39 yt2.start();40 }41 }
多线程总结三:控制线程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。