1、线程的状态:线程对象在不同的运行时期有着不同的状态,此信息就存在与Thread.State枚举类中;
在调用与线程有关的方法后,会进入不同的线程状态;
2、验证NEW RUNNABLE TERMINATED三个状态;
3、验证TIMED_WAITING:此状态代表了执行Thread.sleep的方法,呈等待状态;
4、验证BLOCKED:此状态出现在某个线程等待锁的时候:
5、验证WAITING:此状态是线程执行了Object.wait()方法后所处的状态;
线程组:
1、线程对象关联线程组:1级关联
一级关联:父对象中有子对象,但并不创建子孙对象;关联到线程组这样子;
java.lang.ThreadGroup:线程组表示一个线程的集合。此外,线程组也可以包含其他线程组。线程组构成一棵树,在树中,除了初始线程组外,每个线程组都有一个父线程组。允许线程访问有关自己的线程组的信息,但是不允许它访问有关其线程组的父线程组或其他任何线程组的信息。
2、线程对象关联线程组:
多级关联:父对象中有子对象,子对象中再创建子对象,也就是出现子孙对象的效果了;
3、线程组自动归属特性:
在实例化一个ThreadGroup线程组x时如果不指定所属的线程组,那么这个线程组自动归到当前线程所属的线程组中,也就是隐式的在一个线程组中添加了一个子线程组;
4、获取根线程组:
Thread.currentThread().getThreadGroup().getParent().getName();=>>system
Thread.currentThread().getThreadGroup().getParent().getParent.getName();=>>出现异常
说明JVM的根线程组就是system,再取其父线程组就出现空异常;NullPointerException;
5、线程组里加线程组:
ThreadGroup newGroup = new ThreadGroup(Thread.currentThread().getThreadGroup,“newGroup”);
6、组内的线程批量停止:
–>ThreadGroup group = new ThreadGroup(“我的线程组”);
–>group.interrupt();
使线程具有有序性:
正常情况下线程在运行时多个线程之间执行任务的时机是无序的,可以通过改造代码的方式使他们有序:
package Day02.Test;
/**
* @author Dangxuchao
* @Title: Test6
* @ProjectName 6.2 Java多线程核心编程第七章:查漏补缺
* @Description: 使线程具有有序性;
* 正常情况下线程在运行时多个线程之间执行任务的时机是无序的,
* 可以通过改造代码的方式使他们有序:
*
* @date 2019/6/7 22:22
*/
class Thread6 extends Thread{
private Object lock;
private String showChar;
private int showNum;
private int printCount = 0;//统计打印了几个字母
private volatile static int addNumber = 1;
public Thread6(Object lock, String showChar, int showNum) {
this.lock = lock;
this.showChar = showChar;
this.showNum = showNum;
}
@Override
public void run() {
try{
synchronized (lock){
while (true){
if (addNumber % 3 == showNum){
System.out.println("线程名字="
+Thread.currentThread().getName()
+"run方法计数:"+addNumber+" "+showChar);
lock.notifyAll();
addNumber++;
printCount++;
if (printCount == 3){
break;
}
}else {
lock.wait();
}
}
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
public class Test6 {
public static void main(String[] args) {
Object lock = new Object();
Thread6 a = new Thread6(lock,"A",1);
Thread6 b = new Thread6(lock,"B",2);
Thread6 c = new Thread6(lock,"C",0);
a.start();
b.start();
c.start();
}
}
运行结果: