六、Thread类及常用方法
Thread类常见构造方法:
Thread(String name)
这个方法就是在我们创建线程的时候,对线程进行命名。我们上面的t线程这样的说法注意这里的t是指Thread对象,不是我们线程的名字。所以我们可以通过这个方法对线程进行命名,避免线程混乱的情况。
1. package Thread; 2. 3. public class ThreadDemo8 { 4. public static void main(String[] args) { 5. Thread t=new Thread(()->{ 6. while (true) { 7. System.out.println("hello Thread10086"); 8. } 9. },"Thread10086"); 10. 11. t.start(); 12. } 13. }
然后我们运行后可以通过java的jdk自带的工具程序来进行线程的管理和监视。这就用到了我们的jconsole工具。
然后就是介绍一下Thread(Runnable target,String name)
Thread(Runnable target,String name)
这个就是上述的使用Runnable对象来创建线程的方法了。
1. package Thread; 2. 3. public class ThreadDemo9 { 4. public static void main(String[] args) { 5. Thread t=new Thread(new Runnable() { 6. @Override 7. public void run() { 8. while (true){ 9. System.out.println("hello Thread10010"); 10. } 11. 12. } 13. },"Thread10010"); 14. t.start(); 15. } 16. }
然后我们通过jconsole观察一下:
然后下面是Thread的几个常用的属性。
Thread常见属性:
属性 | 获取方法 |
ID | getId() |
名称 | getName() |
状态 | getState() |
优先级 | getPriority() |
是否后台线程 | isDaemon() |
是否存活 | isAlive() |
是否被中断 | isInterrupted() |
ID&名称:
id是每个线程独一无二的身份标识。
名称是每个线程的名字。
1. package Thread; 2. 3. public class ThreadDemo10 { 4. public static void main(String[] args) { 5. Thread t1=new Thread(()->{ 6. 7. },"T1"); 8. Thread t2=new Thread(()->{ 9. 10. },"T2"); 11. 12. t1.start(); 13. t2.start(); 14. System.out.println(t1.getId()); 15. System.out.println(t2.getId()); 16. System.out.println(t1.getName()); 17. System.out.println(t2.getName()); 18. } 19. }
状态:
状态是当前线程所处的状态。
线程的状态有以下几种:
1、NEW 安排了工作,还没有开始行动
2、RUNNABLE 可工作的(包括正在工作和即将开始工作)
3 、TERMINATED 工作完成了
4、BLOCKED 排队等待其他事情
5、WAITING 排队等待其他事情
6、TIMED_WAITING 排队等待其他事情
NEW
首先说一下NEW,这个就是在我们的run方法中没有进行任务的执行。
1. package Thread; 2. 3. public class ThreadDemo11 { 4. public static void main(String[] args) { 5. Thread t=new Thread(()->{ 6. System.out.println("hello"); 7. }); 8. // t.start(); 9. System.out.println(t.getState()); 10. } 11. }
我们没有进行线程的启动,就说明了我们只是描述了任务是什么(打印hello),但是没有去执行这个任务,所以状态就是NEW
RUNNABLE
那么我们如果的任务没有进行描述,但是我们启动了线程,就相当于老板没有给员工下达任务,员工此时就是可以执行任务的状态RUNNABLE(就是闲着)。
1. package Thread; 2. 3. public class ThreadDemo12 { 4. public static void main(String[] args) { 5. Thread t=new Thread(()->{ 6. 7. }); 8. t.start(); 9. System.out.println(t.getState()); 10. } 11. }
TERMINATED
这个就是表示线程执行完毕了。我们可以用以下代码做理解。
1. package Thread; 2. 3. public class ThreadDemo12 { 4. public static void main(String[] args) { 5. Thread t=new Thread(()->{ 6. 7. }); 8. t.start(); 9. //使用一个sleep使得t线程先执行完毕 10. try { 11. Thread.sleep(1000); 12. } catch (InterruptedException e) { 13. throw new RuntimeException(e); 14. } 15. System.out.println(t.getState()); 16. 17. } 18. }
BLOCKED
BLOCKED这个状态常见于加锁状态,当我们对其进行加锁(synchronized)之后 ,别的对象来获取锁的时候就需要阻塞等待,直到加锁的对象释放锁之后,才有机会获取到锁。
目前先知道对一个代码块加锁后就会出现所谓的加锁状态即可,后面会告诉大家为什么我们要进行加锁操作。
WAITING
WAITING表示排队等待其他事情。(这里先不展开,后面会介绍)
TIMED_WAITING
TIMED_WAITING也表示排队等待其他事情,但是这里的排队是由于系统调用了sleep方法而进入的状态。表示了当前线程需要阻塞等待一定的时间。
1. package Thread; 2. 3. public class ThreadDemo14 { 4. public static void main(String[] args) { 5. Thread t=new Thread(()->{ 6. while (true){ 7. try { 8. Thread.sleep(1000); 9. } catch (InterruptedException e) { 10. throw new RuntimeException(e); 11. } 12. } 13. 14. }); 15. t.start(); 16. try { 17. Thread.sleep(1000); 18. } catch (InterruptedException e) { 19. throw new RuntimeException(e); 20. } 21. System.out.println(t.getState()); 22. } 23. }
附赠状态一览表(简略示意):
优先级
优先级高的线程理论上来说更容易被调度到
后台线程
关于后台线程,需要记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行
存活
是否存活,即简单的理解,为 run 方法是否运行结束了
中断
有关线程中断的问题我们后面再总结,这点的篇幅可能会有点长,不便于总结在此处。
好了,今天的认识线程&Thread类及常用方法&线程状态就大概总结到这里了,下一篇准备总结一下有关线程安全的那些事。