currentThread()方法可以返回代码被那个线程调用的信息。
测试方法如下:
public class MyThread extends Thread{ public MyThread(){ super(); } public MyThread(String name){ super(); this.setName(name); System.out.println("构造器中线程名字:" + Thread.currentThread().getName()); }
@Override public void run() { super.run(); System.out.println("this is MyThread"); System.out.println("run方法中线程名字:" + Thread.currentThread().getName()); }
public static void main(String[] args){
// 继承Thread MyThread myThread = new MyThread("myThread-name"); myThread.start(); }}
输出内容:
构造器中线程名字:mainthis is MyThreadrun方法中线程名字:myThread-name
判断当前线程是否处于活跃状态,活跃状态是指线程已经启动并且尚未终止。
测试代码:
public class IsAliveFunc extends Thread {
@Override public void run() { super.run(); System.out.println("run is alive = " + this.isAlive()); }
public static void main(String[] args){ IsAliveFunc isAliveFunc = new IsAliveFunc(); System.out.println("begin start " + isAliveFunc.isAlive()); isAliveFunc.start(); System.out.println("after start " + isAliveFunc.isAlive()); }
}
输出结果:
begin start falseafter start truerun is alive = true
sleep()方法是让正在运行的线程在指定毫秒数内暂停。
测试代码:
public class SleepFunc {
public static void sleep(){ System.out.println("begin"); try { Thread.sleep(2000); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println("end"); }
public static void main(String[] args){ System.out.println(" begin time = " + System.currentTimeMillis()); sleep(); System.out.println(" end time = " + System.currentTimeMillis()); }}
输出结果:
begin time = 1551138333348beginendend time = 1551138335348
可以看出时间相差2秒。
获取线程的唯一标识。
停止线程意味着在线程处理完任务之前停掉正在做的操作,也就是放弃当前操作。有以下三种方法终止正在运行中的线程:
interrupt()方法的使用并不像for+break语句那样,马上就停止循环。调用interrupt()方法仅仅是在当前线程中打了一个停止的标记,并不是真的停止线程。所以引出this.interrupted()和this.isInterrupted()方法。
所以使用interrupt()时需要判断线程是否有中断标志,在使用return或者抛异常的方式中断此线程。
stop方法是暴力停止线程,已经弃用的方法不建议使用。而且使用可能会抛出java.lang.ThreadDeath异常。如果强制让线程停止则可能使一些清理性的工作的不能完成。另一种情况就是对锁定的对象解锁,出现数据不一致的情况。
暂停线程可以使用suspend()方法,使用resume()方法恢复。但是这两个方法都是被废弃的方法,不建议使用。这两个方法如果使用不当会造成同步对象的独占,是其他线程无法访问公共同步对象;也有可能产生数据不同步的情况。
所以建议使用wait()方法暂停线程,使用notify()或者notifyAll()方法唤醒线程,这两种方法会在线程后面的文章线程通信部分讲解。
yield()方法的作用的是放弃当前的CPU资源,将他让给其他的任务去占用CPU执行时间,但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片。
在操作系统中,线程可以划分优先级,优先级高的线程得到的CPU资源较多,也就是说CPU优先执行优先级高的线程。线程的优先级具有继承性,比如A线程启动B线程,则B线程的优先级与A线程的一样。
修改优先级的方法是setPriority()。
优先级高的线程总是大部分先执行,但不代表优先级高的线程全部先执行。线程优先级还具有“随机性”,也就是优先级高的线程不一定每次都先执行。
在Java线程中有两种线程,一种是用户线程,另一种就是守护线程。守护线程具有陪伴的含义,当进程中不存在非守护线程了,则守护线程自动销毁。典型的守护线程就是垃圾回收线程。可以通过调用Thead类的setDaemon(true)方法设置当前的线程为守护线程。
注意事项:
public class DaemonThread extends Thread {
private int i = 0;
@Override public void run() { super.run(); try { while (true){ i++; System.out.println("i = " + i); Thread.sleep(1000); } }catch (Exception e){ e.printStackTrace(); } }}
public class DaemonThread extends Thread {
private int i = 0;
@Override public void run() { super.run(); try { while (true){ i++; System.out.println("i = " + i); Thread.sleep(1000); } }catch (Exception e){ e.printStackTrace(); } }}
输出结果:
i = 1i = 2i = 3i = 4i = 5i = 6我离开thread对象也不再打印了,也就是停止了!