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

Java 多线程编程学习(二)

2016-05-03 12:55 405 查看
线程的介绍及使用多线程(传送门

一、currentThread()方法

currentThread()方法可返回代码段正在被哪个线程调用的信息。

1.先贴测试一段代码

public class MyThread extends Thread {

public MyThread(){
System.out.println("构造方法的打印:" + Thread.currentThread().getName());
}
@Override
public void run(){
System.out.println("run方法的打印:" + Thread.currentThread().getName());
}

public static void main(String[] args) {
MyThread mythread = new MyThread();  //此句为main线程调用构造函数
mythread.start();     //线程已准备就绪,等待系统调用mythread对象的run方法
//mythread.run();     //此句为main线程调用run方法

}

}


MyThread.java类的构造函数是被main线程调用的,而run方法是被名称为Thread-0的线程调用的,run方法是自动调用的方法。但如果main方法中调用代码mythread.run(),则run方法由main线程调用。(详见多线程学习(一))

2.下面测试一个比较复杂的情况,创建测试用的Java文件CountOperate.java

public class CountOperate extends Thread {

public CountOperate(){
System.out.println("CountOperate---begin");
System.out.println("Thread.currentThread().getName()=" +
Thread.currentThread().getName());
System.out.println("this.getName()=" + this.getName());
System.out.println("CountOperate---end");

}
@Override
public void run(){
System.out.println("run---begin");
System.out.println("Thread.currentThread().getName()=" +
Thread.currentThread().getName());
System.out.println("this.getName()=" + this.getName());
System.out.println("run---end");
}

public static void main(String[] args) {
CountOperate c = new CountOperate();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.setName("A");
t1.start();
t2.start();

}

}


//运行结果
CountOperate---begin
Thread.currentThread().getName()=main
this.getName()=Thread-0
CountOperate---end
run---begin
Thread.currentThread().getName()=A
this.getName()=Thread-0
run---end

3.多线程编程Thread.currentThread().getName()和this.getName()区别

由上面例子可以看出,类的构造方法由main线程调用,创建出名为Thread-0的线程,再由线程Thread-0创建出线程Thread-1和Thread-2,并将Thread-1的线程名称改为A(此时Thread-0的活动状态已经结束)。this.getName()之所以均输出线程名称为Thread-0,是因为JVM不知道线程执行到哪里了,只有使用Thread.
currentThread().getName()才能准确得到当前正在执行的线程名称

二、 isAlive()方法和sleep()方法

方法isAlive()的作用是测试线程是否处于活动状态。活动状态就是线程已经启动且尚未终止,而线程处于正在运行或准备开始运行的状态,就认为线程是“存活”的。

方法sleep()的作用是在指定的毫秒数内让当前“正在执行的线程”休眠 (暂停执行)。这个“正在执行的线程”是指this.currentThread()返回的线程。

public class MyThread extends Thread {

@Override
public void run(){
try{
System.out.println("begin Alive =" + Thread.currentThread().isAlive());
System.out.println("run threadName=" +
Thread.currentThread().getName() + " begin =" +
System.currentTimeMillis());
Thread.sleep(1000);
System.out.println("end Alive =" + Thread.currentThread().isAlive());
System.out.println("run threadName=" +
Thread.currentThread().getName() + " end =" +
System.currentTimeMillis());
}catch(InterruptedException e){
e.printStackTrace();
}

}

public static void main(String[] args) throws InterruptedException{
MyThread c = new MyThread();
c.start();
Thread.sleep(2000);
System.out.println("c Alive =" + c.isAlive());

}

}


//运行结果
begin Alive =true
run threadName=Thread-0 begin=1462250706904
end Alive =true
run threadName=Thread-0 end=1462250707905
c Alive =false

系统调用线程run方法运行开始与结束时间差为1000毫秒,在这两个时间线程都处于活动状态。而mian函数中的线程活动状态为false,因为c对象已经在2秒内执行完毕(包括沉睡1秒)

参考文献:

《Java多线程编程核心技术》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: