Java 多线程编程学习(二)

本文介绍了Java中的线程概念,包括currentThread()方法的用途、如何判断线程是否处于活动状态以及如何使线程暂停执行。通过示例代码详细解释了Thread.currentThread().getName()和this.getName()的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程的介绍及使用多线程(传送门


一、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多线程编程核心技术

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值