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 @Override 26 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 }
JoinThread
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 @Override 20 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 }
DaemonThread
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 }
SleepTest
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 }
YieldTest
时间: 2024-10-08 01:20:16