您的位置:首页 > 编程语言 > Java开发

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);
}
}


效果图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: