轉自:
http://www.java265.com/JavaCourse/202204/3183.html
執行緒(英語:thread)是作業系統能夠進行運算調度的最小單位,它被包含在行程之中,是行程中的實際運作單位,一條執行緒指的是行程中一個單一順序的控制流,一個行程中可以并發多個執行緒,每條執行緒并行執行不同的任務,在Unix System V及SunOS中也被稱為輕量行程(lightweight processes),但輕量行程更多指內核執行緒(kernel thread),而把用戶執行緒(user thread)稱為執行緒,
執行緒是獨立調度和分派的基本單位,執行緒可以為作業系統內核調度的內核執行緒,如Win32執行緒;由用戶行程自行調度的用戶執行緒,如Linux平臺的POSIX Thread;或者由內核與用戶行程,如Windows 7的執行緒,進行混合調度,
同一行程中的多條執行緒將共享該行程中的全部系統資源,如虛擬地址空間,檔案描述符和信號處理等等,但同一行程中的多個執行緒有各自的呼叫堆疊(call stack),自己的暫存器環境(register context),自己的執行緒本地存盤(thread-local storage),
一個行程可以有很多執行緒,每條執行緒并行執行不同的任務,
在多核或多CPU,或支持Hyper-threading的CPU上使用多執行緒程式設計的好處是顯而易見,即提高了程式的執行吞吐率,在單CPU單核的計算機上,使用多執行緒技術,也可以把行程中負責I/O處理、人機互動而常被阻塞的部分與密集計算的部分分開來執行,撰寫專門的workhorse執行緒執行密集計算,從而提高了程式的執行效率
下文筆者講述獲取執行緒id的方法分享,如下所示:
實作思路:
使用getThreadId()方法即可獲取執行緒Id
例:
獲取執行緒id的示例分享
package com.java265.other;
public class Test16 extends Object implements Runnable {
private ThreadID var;
public Test16(ThreadID v) {
this.var = v;
}
public void run() {
try {
print("var getThreadID =" + var.getThreadID());
Thread.sleep(2000);
print("var getThreadID =" + var.getThreadID());
} catch (InterruptedException x) {
}
}
private static void print(String msg) {
String name = Thread.currentThread().getName();
System.out.println(name + ": " + msg);
}
public static void main(String[] args) {
ThreadID tid = new ThreadID();
Test16 shared = new Test16(tid);
try {
Thread threadA = new Thread(shared, "threadA");
threadA.start();
Thread.sleep(500);
Thread threadB = new Thread(shared, "threadB");
threadB.start();
Thread.sleep(500);
Thread threadC = new Thread(shared, "threadC");
threadC.start();
} catch (InterruptedException x) {
}
}
}
class ThreadID extends ThreadLocal {
private int nextID;
public ThreadID() {
nextID = 10001;
}
private synchronized Integer getNewID() {
Integer id = nextID;
nextID++;
return id;
}
protected Object initialValue() {
print("in initialValue()");
return getNewID();
}
public int getThreadID() {
Integer id = (Integer) get();
return id.intValue();
}
private static void print(String msg) {
String name = Thread.currentThread().getName();
System.out.println(name + ": " + msg);
}
}
-----運行以上代碼,將輸出以下資訊------
threadA: in initialValue()
threadA: var getThreadID =10001
threadB: in initialValue()
threadB: var getThreadID =10002
threadC: in initialValue()
threadC: var getThreadID =10003
threadA: var getThreadID =10001
threadB: var getThreadID =10002
threadC: var getThreadID =10003
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/499610.html
標籤:Java
上一篇:02-分布式事務之Seata入門
下一篇:ClassReader簡介說明
