java多线程的常用方法(以及注意事项)

1 /*

2  *           线程的常用方法

3  *           1.start();

4  *           2.run();

5  *           3.sleep(int millsecond);  

6  *           4.isAlive();       -->判断线程是否还在运行

7  *           5.currentThread(); -->返回当前正在使用CPU资源的线程

8  *           6.interrupt();     -->激活休眠的线程

9  * */

但是需要注意的一个小点是:

1 /*

2  *   需要注意到地方:一个已经运行的线程在没有进入死亡状态时,

3  *   不要在给线程分配实体,由于线程只能引用最后分配的实体,

4  *   先前的实体就会成为“垃圾”,并且不会被垃圾收集器收集掉

5  * */

            java多线程的常用方法(以及注意事项)

 

     

 

      

  如果在执行一行这样的代码:

   Thread = new Thread(Target);

       会产生这样的一个效果,如图:

java多线程的常用方法(以及注意事项)

     便会又开始建立一个线程,这样Thread原先的线程就会变成垃圾实体。而且更重要的是垃圾集收器不会去处理它,

因为JVM(java virtual Machine(java虚拟机))会认为原先的那个实体正在运行状态,如果突然释放掉内存,可能

会引起错误甚至设备的毁坏   。

如果在一个开启线程的情况下,有重新开启线程会怎么样勒?

代码:

 1 import java.text.SimpleDateFormat;

 2 import java.util.Date;

 3 

 4 public class Example12_5 {

 5     public static void main(String args [])

 6     {

 7       Home home = new Home();

 8       Thread showTime = new Thread(home);

 9       showTime.start();

10     }

11 }

12 

13 class Home implements Runnable

14 {

15         int time=0;

16        SimpleDateFormat m = new SimpleDateFormat("hh:mm:ss");

17        Date date;

18     public void run() {

19         // TODO Auto-generated method stub

20         while(time<10)

21         {

22             date = new Date();

23             System.out.println(m.format(date));

24             time++;

25           try {

26                  Thread.sleep(1000);

27         } catch (InterruptedException e) {

28             // TODO Auto-generated catch block

29                e.printStackTrace();

30         }

31            if(time==3)

32            {

33              Thread thread=Thread.currentThread();

34              thread = new Thread(this);

35              thread.start();

36            }    

37         }

38     }    

39 }

效果图:

java多线程的常用方法(以及注意事项)

看到上图中的 :

                    

你会发现每一次都出现两个相同的时间,这便是垃圾实体和新实体都在运行的结果..

   下面介绍一下介绍一下currentThread()-->即当前线程 和 interrupt() ----》来激活被sleep()处于休眠的线程

 

1 /*

2  * 有两个线程: student和teacher 其中student准备睡觉一小时后在开始上课, 3  * teacher在输出3句“上课”后在开始上课,teacher在输出3句“上课”后,吵醒 4  * 休眠的线程student。 5  */

 

 

 

 1 public class Example12_6 {

 2   public static void main(String args [] )

 3   {

 4     ClassRoom classroom = new ClassRoom();

 5     classroom.student.start();

 6     classroom.teacher.start();

 7   }

 8 }

 9 

10 class ClassRoom implements Runnable

11 {

12     Thread student ,teacher ;      //教室里有student和teacher两个线程

13     ClassRoom()

14     {

15         teacher = new Thread(this);

16         student = new Thread(this);

17         teacher.setName("王老师");

18         student.setName("张兰");

19     }

20     public void run() {

21         // TODO Auto-generated method stub

22       if(Thread.currentThread()==student)

23       {

24         out(student.getName()+"正在睡觉,不听课");  

25         try {

26             Thread.sleep(1000*360);

27         } catch (InterruptedException e) {

28             // TODO Auto-generated catch block

29             //e.printStackTrace();

30             out(student.getName()+"被老师叫醒了");

31         }

32         out(student.getName()+"开始听课了");

33       }

34       else if(Thread.currentThread()==teacher)

35       {

36           for(int i=1;i<=3;i++)

37                out("上课!"); 

38           try {

39             Thread.sleep(400);

40         } catch (InterruptedException e) {

41             // TODO Auto-generated catch block

42         //    e.printStackTrace();

43         }

44        student.interrupt();   //激活原先休眠的student  

45       }

46     }

47     

48     void out(String str) {

49       System.out.println(str);

50     }

51 }

 

 

效果图:

java多线程的常用方法(以及注意事项)

 

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