java多线程的常用方法(以及注意事项)
2014-08-02 17:47
585 查看
/* * 线程的常用方法 * 1.start(); * 2.run(); * 3.sleep(int millsecond); * 4.isAlive(); -->判断线程是否还在运行 * 5.currentThread(); -->返回当前正在使用CPU资源的线程 * 6.interrupt(); -->激活休眠的线程 * */
但是需要注意的一个小点是:
/* * 需要注意到地方:一个已经运行的线程在没有进入死亡状态时, * 不要在给线程分配实体,由于线程只能引用最后分配的实体, * 先前的实体就会成为“垃圾”,并且不会被垃圾收集器收集掉 * */
如果在执行一行这样的代码:
Thread = new Thread(Target);
会产生这样的一个效果,如图:
便会又开始建立一个线程,这样Thread原先的线程就会变成垃圾实体。而且更重要的是垃圾集收器不会去处理它,
因为JVM(java virtual Machine(java虚拟机))会认为原先的那个实体正在运行状态,如果突然释放掉内存,可能
会引起错误甚至设备的毁坏 。
如果在一个开启线程的情况下,有重新开启线程会怎么样勒?
代码:
import java.text.SimpleDateFormat; import java.util.Date; public class Example12_5 { public static void main(String args []) { Home home = new Home(); Thread showTime = new Thread(home); showTime.start(); } } class Home implements Runnable { int time=0; SimpleDateFormat m = new SimpleDateFormat("hh:mm:ss"); Date date; public void run() { // TODO Auto-generated method stub while(time<10) { date = new Date(); System.out.println(m.format(date)); time++; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(time==3) { Thread thread=Thread.currentThread(); thread = new Thread(this); thread.start(); } } } }
效果图:
看到上图中的 :
你会发现每一次都出现两个相同的时间,这便是垃圾实体和新实体都在运行的结果..
下面介绍一下介绍一下currentThread()-->即当前线程 和 interrupt() ----》来激活被sleep()处于休眠的线程
/* * 有两个线程: student和teacher 其中student准备睡觉一小时后在开始上课, * teacher在输出3句“上课”后在开始上课,teacher在输出3句“上课”后,吵醒 * 休眠的线程student。 */
public class Example12_6 { public static void main(String args [] ) { ClassRoom classroom = new ClassRoom(); classroom.student.start(); classroom.teacher.start(); } } class ClassRoom implements Runnable { Thread student ,teacher ; //教室里有student和teacher两个线程 ClassRoom() { teacher = new Thread(this); student = new Thread(this); teacher.setName("王老师"); student.setName("张兰"); } public void run() { // TODO Auto-generated method stub if(Thread.currentThread()==student) { out(student.getName()+"正在睡觉,不听课"); try { Thread.sleep(1000*360); } catch (InterruptedException e) { // TODO Auto-generated catch block //e.printStackTrace(); out(student.getName()+"被老师叫醒了"); } out(student.getName()+"开始听课了"); } else if(Thread.currentThread()==teacher) { for(int i=1;i<=3;i++) out("上课!"); try { Thread.sleep(400); } catch (InterruptedException e) { // TODO Auto-generated catch block // e.printStackTrace(); } student.interrupt(); //激活原先休眠的student } } void out(String str) { System.out.println(str); } }
效果图:
相关文章推荐
- java中定义常量的方法、性能以及注意事项
- java多线程----关于join方法的注意点,以及守护线程的小结
- Java String的常用方法及使用注意事项
- Python序列之list和tuple常用方法以及注意事项
- iPhone SDK中多线程的使用方法以及注意事项
- iPhone SDK中多线程的使用方法以及注意事项
- OC中关于日期的常用方法以及注意事项
- iPhone SDK中多线程的使用方法以及注意事项
- iPhone SDK中多线程的使用方法以及注意事项
- Java基础:String类之常用方法及使用注意事项
- cocos2d-x调用java中非静态方法以及静态方法注意事项以及示例
- iPhone SDK中多线程的使用方法以及注意事项 转载
- GridView导出Excel方法源码以及注意事项
- java多线程实现火车售票系统 以及java中的同步的实现 同步块 和同步方法同时 同步
- java的synchronized关键字,多线程编程的注意事项
- Java String的常用方法及使用注意事项
- java学习之类,方法,属性,变量注意事项
- java中重写Object类的equals方法和Hashcode方法的注意事项
- 关于java的setter&getter方法的注意事项