本文章首发微信公众号:IT笔记分享java
欢迎扫码关注我 😊 bash
currentThread()方法能够返回代码被那个线程调用的信息。微信
测试方法以下:ide
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();
}
}
复制代码
输出内容:测试
构造器中线程名字:main
this is MyThread
run方法中线程名字:myThread-name
复制代码
判断当前线程是否处于活跃状态,活跃状态是指线程已经启动而且还没有终止。this
测试代码:spa
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 false
after start true
run is alive = true
复制代码
sleep()方法是让正在运行的线程在指定毫秒数内暂停。线程
测试代码:code
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 = 1551138333348
begin
end
end 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 = 1
i = 2
i = 3
i = 4
i = 5
i = 6
我离开thread对象也再也不打印了,也就是中止了!
复制代码