一、直接使用 Thread
// 創(chuàng)建線程對(duì)象
Thread t = new Thread() {
? ?public void run() {
? ? ? ?// 要執(zhí)行的任務(wù)
? }
};
// 啟動(dòng)線程
t.start();
例如:
// 構(gòu)造方法的參數(shù)是給線程指定名字,推薦
Thread t1 = new Thread("t1") {
? ?@Override
? ?// run 方法內(nèi)實(shí)現(xiàn)了要執(zhí)行的任務(wù)
? ?public void run() {
? ? ? ?log.debug("hello");
? }
};
t1.start();
輸出
19:19:00 [t1] c.ThreadStarter - hello
注意:這里通過(guò)@Slf4j
二、使用 Runnable
把【線程】和【任務(wù)】(要執(zhí)行的代碼)分開
-
Thread 代表線程
-
Runnable 可運(yùn)行的任務(wù)(線程要執(zhí)行的代碼)
Runnable runnable = new Runnable() {
? ?public void run(){
? ? ? ?// 要執(zhí)行的任務(wù)
? }
};
// 創(chuàng)建線程對(duì)象
Thread t = new Thread( runnable );
// 啟動(dòng)線程
t.start();
例如:
// 創(chuàng)建任務(wù)對(duì)象
Runnable task2 = new Runnable() {
? ?@Override
? ?public void run() {
? ? ? ?log.debug("hello");
? }
};
?
// 參數(shù)1 是任務(wù)對(duì)象; 參數(shù)2 是線程名字,推薦
Thread t2 = new Thread(task2, "t2");
t2.start();
輸出
19:19:00 [t2] c.ThreadStarter - hello
Java 8 以后可以使用 lambda 精簡(jiǎn)代碼
// 創(chuàng)建任務(wù)對(duì)象
Runnable task2 = () -> log.debug("hello");
?
// 參數(shù)1 是任務(wù)對(duì)象; 參數(shù)2 是線程名字,推薦
Thread t2 = new Thread(task2, "t2");
t2.start();
小結(jié)
-
方法1 是把線程和任務(wù)合并在了一起,方法2 是把線程和任務(wù)分開了
-
推薦使用用 Runnable,因?yàn)?更容易與線程池等高級(jí) API 配合
-
用 Runnable 讓任務(wù)類脫離了 Thread 繼承體系,更靈活
三、FutureTask
FutureTask (未來(lái)任務(wù))能夠接收 Callable 類型的參數(shù),用來(lái)處理有返回結(jié)果的情況
// 創(chuàng)建任務(wù)對(duì)象
FutureTask<Integer> task3 = new FutureTask<>(() -> {
? ?log.debug("hello");
? ?Thread.sleep(2000);
? ?return 100;
});
?
// 參數(shù)1 是任務(wù)對(duì)象; 參數(shù)2 是線程名字,推薦
new Thread(task3, "t3").start();
?
// 運(yùn)行到這里主線程阻塞,會(huì)同步等待 task 執(zhí)行完畢的結(jié)果
Integer result = task3.get();
log.debug("結(jié)果是:{}", result);
輸出
19:22:27 [t3] c.ThreadStarter - hello
19:22:29 [main] c.ThreadStarter - 結(jié)果是:100
可以看到兩秒后主線程返回結(jié)果
四、觀察多個(gè)線程同時(shí)運(yùn)行
主要是理解
-
交替執(zhí)行
-
誰(shuí)先誰(shuí)后,線程的執(zhí)行不由我們控制
代碼
? ?public static void main(String[] args) {
? ? ? ?new Thread(() -> {
? ? ? ? ? ?while(true) {
? ? ? ? ? ? ? ?log.debug("running");
? ? ? ? ? }
? ? ? },"t1").start();
? ? ? ?new Thread(() -> {
? ? ? ? ? ?while(true) {
? ? ? ? ? ? ? ?log.debug("running");
? ? ? ? ? }
? ? ? },"t2").start();
? }
結(jié)果
可以看到,線程是交替運(yùn)行的。但是誰(shuí)先誰(shuí)后不是我們控制的。但是如果是單核CPU的話運(yùn)行這段程序的話,只會(huì)有一個(gè)線程開始運(yùn)行。
五、查看進(jìn)程線程
5.1 windows
-
任務(wù)管理器可以查看進(jìn)程和線程數(shù),也可以用來(lái)殺死進(jìn)程
-
控制臺(tái)
tasklist
查看進(jìn)程 -
控制臺(tái)
taskkill /F /PID pid編號(hào)
殺死進(jìn)程
5.2 linux
-
ps -fe
查看所有進(jìn)程 -
ps -fe | grep 關(guān)鍵詞
查看所有進(jìn)程 -
ps -fT -p <PID>
查看某個(gè)進(jìn)程(PID)的所有線程 -
kill
殺死進(jìn)程 -
top
按大寫 H 切換是否顯示線程 -
top -H -p <PID>
查看某個(gè)進(jìn)程(PID)的所有線程,可持續(xù)查看線程的狀態(tài)
5.3 Java
-
jps
命令查看所有 Java 進(jìn)程 -
jstack <PID>
查看某個(gè) Java 進(jìn)程(PID)的所有線程狀態(tài) ,只能查看某一刻某個(gè)進(jìn)程所有線程較詳細(xì)的狀態(tài) -
jconsole
來(lái)查看某個(gè) Java 進(jìn)程中線程的運(yùn)行情況(圖形界面) - 如果是從命令行啟動(dòng),使 JDK 在 PATH 上,運(yùn)行 jconsole 即可;如果從 GUI shell 啟動(dòng),找到 JDK 安裝路徑,打開 bin 文件夾,雙擊?jconsole
??jconsole 遠(yuǎn)程監(jiān)控配置
-
需要以如下方式運(yùn)行你的 java 類
java -Djava.rmi.server.hostname=`ip地址` -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=`連接端口` -Dcom.sun.management.jmxremote.ssl=是否安全連接 -Dcom.sun.management.jmxremote.authenticate=是否認(rèn)證 java類
-
修改 /etc/hosts 文件將 127.0.0.1 映射至主機(jī)名
如果要認(rèn)證訪問(wèn),還需要做如下步驟
-
復(fù)制 jmxremote.password 文件
-
修改 jmxremote.password 和 jmxremote.access 文件的權(quán)限為 600 即文件所有者可讀寫
-
連接時(shí)填入 controlRole(用戶名),R&D(密碼)
這種方式了解一下即可。對(duì)于生產(chǎn)環(huán)境一般沒(méi)有權(quán)限訪問(wèn)的。
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-424110.html文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-424110.html
?
到了這里,關(guān)于Java并發(fā)(三)----創(chuàng)建線程的三種方式及查看進(jìn)程線程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!