zoukankan      html  css  js  c++  java
  • 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  * */

                

         

          

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

       Thread = new Thread(Target);

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

         便会又开始建立一个线程,这样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 }

    效果图:

    看到上图中的 :

                        

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

       下面介绍一下介绍一下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 }

    效果图:

  • 相关阅读:
    吴裕雄--天生自然 R语言开发学习:高级编程
    吴裕雄--天生自然 R语言开发学习:使用ggplot2进行高级绘图(续二)
    吴裕雄--天生自然 R语言开发学习:使用ggplot2进行高级绘图(续一)
    吴裕雄--天生自然 R语言开发学习:使用ggplot2进行高级绘图
    吴裕雄--天生自然 R语言开发学习:处理缺失数据的高级方法(续一)
    吴裕雄--天生自然 R语言开发学习:处理缺失数据的高级方法
    吴裕雄--天生自然 R语言开发学习:分类(续二)
    2018年阿里云NoSQL数据库大事盘点
    就差这2块钱的安全投入,让这家企业损失了1977万!
    如何打造7*24h持续交付通道?阿里高级技术专家的5点思考
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3887267.html
Copyright © 2011-2022 走看看