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();
}
}
運行結果: