多线程总结三:控制线程

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

 

你可能感兴趣的:(多线程)