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 }
效果图:
编程是一种快乐,享受代码带给我的乐趣!!!