Java線程的使用及共享協作

創建線程的三種方式

1、繼承Thread;

static class MyThread extends Thread{@Overridepublic void run() {//do something...}
}
public static void main(String[] args) throws InterruptedException {MyThread thread = new MyThread ();thread.start();
}

2、實現Runnable接口(該接口無返回值);

static class MyRunnable implements Runnable {public void run() {//do something...}
}
public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(new MyRunnable(),"MyRunnable");thread.start();
}

3、實現Callable接口(該接口有返回值,在之前的SpringMvc中有提到過)

static class MyCallable implements Callable<String> {public String run() {String result = "";//do something...return result;}
}
public static void main(String[] args) throws InterruptedException {FutureTask<String> task = new FutureTask<String>(MyCallable);new Thread(task).start();//獲取結果值String result = task.get();
}

jdk也提供了通過了創建線程池的方式去創建線程,但是線程池底層及時通過去創建Thread對象創建線程的,所以只有這三種方式

線程共享協作

先來認識一下 synchronized?這個關鍵字,這個在大部分網上都能找到相關的資料,這里就簡單的說明一下:

synchronized鎖也叫內置鎖,可用于兩種情況,1、修飾在靜態方法上,即類鎖;2、修飾在普通方法上或者synchronized代碼塊,即對象鎖。示例如下:

//類鎖:
public synchronized static void function(){//do something...}
//對象鎖:
//修飾方法,同一個對象同一時刻只能有一個線程執行該方法
public synchronized void function(){...}
//synchronized 代碼快
public void function(){synchronized(this){//鎖住當前對象(this可替換成其他對象,即只有執行完當前代碼塊后,才能釋放,同一時刻,當前線程獲取到對象鎖后,才能執行,其他線程進入等待阻塞狀態)//...}
}

volatile關鍵字:適合于只有一個線程寫,多個線程讀的場景,因為它只能確保可見性。

ThreadLocal:可以參考ThreadLocal詳解,這篇講的挺詳細的

wait(),notify()/notifyAll()

wait():即等待通知,作用于對象上,當前線程調用對象的wait()方法會使進入阻塞狀態并釋放當前持有鎖,需和synchronized一起使用,等待當前對象調用notify/notifyAll()方法之后,需重新競爭到鎖后,方可繼續執行,未被喚醒則一直等待。

notify()/notifyAll():作用于對象上,用來喚醒阻塞狀態的wait()方法,需和synchronized一起使用,執行完后,需繼續執行后面的程序才能釋放當前持有鎖,一般將該方法放于最后

public void function () {//...synchronized (this) {//do something...notify();}//...
}

notify()喚醒隨機一個wait()方法阻塞線程,而notifyAll()則是喚醒所有的wait()阻塞線程,wait()被喚醒后,需重新去競爭鎖,才能繼續執行

wait(long mills):即等待超時方法,即等待mills毫秒后,如若時間到后未收到喚醒,則繼續執行后面的代碼。

long  overtime = now+T;
long remain = T;//等待的持續時間
while(result不滿足條件&& remain>0){wait(remain);remain = overtime – now;//等待剩下的持續時間
}
return result;

join()

可以將并行執行的線程變成串行執行模式,可以理解為插隊執行,以下為示例:

static class Worker implements Runnable{private Thread thread;public Worker(Thread thread) {this.thread = thread;}public void run() {try {System.out.println(thread.getName()+"start join...");thread.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+" terminte..." + System.currentTimeMillis());}}public static void main(String[] args) throws InterruptedException {System.out.println(Thread.currentThread().getName()+" start..." + System.currentTimeMillis());Thread main = Thread.currentThread();Thread thread1 = new Thread(new Worker(main),"join1");Thread thread2 = new Thread(new Worker(thread1),"join2");Thread thread3 = new Thread(new Worker(thread2),"join3");thread1.start();thread2.start();thread3.start();System.out.println(Thread.currentThread().getName()+" sleep...");try {Thread.sleep(1000);System.out.println(Thread.currentThread().getName()+" end...");} catch (InterruptedException e) {e.printStackTrace();}}

執行結果為:

main start...1616734827339
main sleep...
mainstart join...
join2start join...
join1start join...
main end...
join1 terminte...1616734828340
join2 terminte...1616734828340
join3 terminte...1616734828340

即在當前線程中調用其他線程的join()方法后,其他線程就會進去到阻塞狀態,只有等待當前線程執行完成后,其他線程才能繼續執行,由并行變成串行;

join()方法里面也是由wait()方法去處理的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537186.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537186.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537186.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WCF學習筆記(三):開啟net.tcp端口

正在做一個使用tcp協議的WCF示例&#xff0c;遇到很多問題。首當其沖的問題就是——如何為WCF打開tcp端口。。。 具體步驟如下&#xff1a; 1、在IIS中為WCF安裝支持TCP協議的組件&#xff1a; 2、在防火墻的入棧規則中開啟808端口&#xff1b; 3、在servies.msc中打開兩個服務…

孿生神經網絡_軒轅實驗室:數字孿生:基于機器學習的汽車數字孿生模型

本文來源&#xff1a;A. Rassolkin, T. Vaimann, A. Kallaste, and V. Kuts, “Digital twin for propulsion drive of autonomous electric vehicle,” in 2019 IEEE 60th International Scientific Conference on Power and Electrical Engineering of Riga Technical Univer…

Java線程Fork/Join思想及實現

最近在看線程這一塊的東西&#xff0c;所以之前的那篇文章就是用來記錄的&#xff0c;但看起來好簡單的樣子&#xff0c;哈哈哈&#xff01; 這兩天看的是Fork/Join 分而治之的思想&#xff0c;Doug Lea大師的JUC還是挺強的&#xff0c;學并發編程應該沒有人不知道這個大佬吧&…

Sgen.exe: Speed up XmlSerializer's Startup Performance [.NET 2.0, XML Serialization]

Sgen.exe: Speed up XmlSerializers Startup Performance [.NET 2.0, XML Serialization] Written by Allen Lee 1. Why Sgen.exe? 在《Serialize Your Deck with Positron [XML Serialization, XSD, C#]》一文中&#xff0c;我們領略到 XML Serialization 是如何簡化我們的 X…

Java線程并發常用工具類使用

這次整理了一些比較常用的線程工具類啦。 CountDownLatch&#xff1a;在一組線程執行完后&#xff0c;才能開始執行調用等待的線程。上片文章提到過junit的測試盡量不要測試線程&#xff0c;如果硬是要可以使用CountDownLatch進行測試 CyclicBarrier&#xff1a;在一組線程中…

三維圖形幾何變換算法實驗_計算機視覺方向簡介 | 深度學習視覺三維重建

點擊上方“計算機視覺life”&#xff0c;選擇“星標”快速獲得最新干貨作者&#xff1a; Moonsmilehttps://zhuanlan.zhihu.com/p/79628068本文已由作者授權&#xff0c;未經允許&#xff0c;不得二次轉載三維重建意義三維重建作為環境感知的關鍵技術之一&#xff0c;可用于自動…

讀《高效程序員的45個習慣——敏捷開發修煉之道》

本書主要用平易的語言講述了45個有助于提高程序員自身敏捷的習慣&#xff0c;個人感覺這種老外寫的書翻譯成中文就少了很多意思。 主要的45個習慣是&#xff1a; 做事欲速則不達對事不對人排除萬難跟蹤變化對團隊投資懂得丟棄打破沙鍋問到底把握開發節奏讓客戶做決定讓設計指導…

Java線程CAS原子操作

這次分享一些關于原子操作(CAS)的東西. 定義 CAS(Compare And Swap)是CPU的一個指令級別的操作&#xff0c;叫原子操作&#xff0c;原子操作是不可分割的&#xff0c;跟事務差不多&#xff0c;要么全部執行完成&#xff0c;要么不執行&#xff1b; 像這種操作有點類似阻塞鎖…

python 導航欄_解析導航欄的url--selnium,beautifulsoup實戰

前段時間做ui自動化測試的時候&#xff0c;導航欄菜單始終有點問題&#xff0c;最后只好直接獲取到url&#xff0c;然后直接使用driver.get(url)進入頁面&#xff1b;包括做壓測的時候&#xff0c;比如我要找出所有報表菜單的url&#xff0c;這樣不可能手動去一個一個找出來&am…

PNG圖片詳解

1、PNG圖片類型 PNG格式有8位、24位、32位三種&#xff0c;下面是一些術語&#xff1a; 索引透明&#xff1a;類似于GIF&#xff0c;某一像素只有全透和全不透明兩種效果Alpha透明&#xff1a;半透明PNG8 8位的PNG最多支持256&#xff08;2的8次方&#xff09;種顏色&#xff0…

Java并發編程之顯式鎖(Lock)使用

又是一個基于AQS好用的類&#xff0c;看來下次有必要看看AQS了&#xff0c;正好又是放假。 既然叫顯式鎖&#xff0c;必然也有隱式鎖&#xff0c;也就是所謂的synchronzied關鍵字&#xff0c;它們兩者的區別呢在于使用范圍&#xff0c;synchronzied關鍵字的使用范圍比Lock要小…

python pychart三維_詳解python模塊pychartdir安裝及導入問題

在遷移別人寫好的腳本時&#xff0c;發現pychartdir沒有導入&#xff0c;腳本執行報錯。以下是報錯內容&#xff1a;[modpsLGJF-ZYC5-MMSC-WEB02 ~]$ python /opt/aspire/product/modps/mopps/shell/dayreport_linux.py/etc/host.conf: line 1: bad command nospoof on"Tr…

vim 中Ctags的安裝和使用

Ctags是一個用來為源文件中的標識符&#xff08;如變量、函數、類成員、宏定義等&#xff09;創建索引文件的程序。這些tags文件能被編輯器或其它工具用來快速查找定位源代碼中的符號&#xff08;tag/symbol&#xff09;&#xff0c;如變量名&#xff0c;函數名等。 Tags文件中…

Java并發編程之AbstractQueuedSynchronizer(AQS)源碼解析

自己一個人隨便看看源碼學習的心得&#xff0c;分享一下啦&#xff0c;不過我覺得還是建議去買本Java并發編程的書來看會比較好點&#xff0c;畢竟個人的理解有限嘛。 獨占鎖和共享鎖 首先先引入這兩個鎖的概念&#xff1a;獨占鎖即同一時刻只有一個線程才能獲取到鎖&#xf…

采集用python還是火車頭_我才知道爬蟲也可以醬紫--火車采集器

我才知道爬蟲還可以這樣—火車采集器的使用說在前面額。。。好吧&#xff0c;我這一個三毛錢的屌絲也開始步入實習階段了&#xff0c;在北京其實也挺好的&#xff0c;雖說壓力大&#xff0c;但是今后就業機會也相對而言大一些。好了&#xff0c;說回今天的主題&#xff0c;之前…

mvn 使用中的錯誤

出現這種錯誤的時候&#xff1a;mvn Error building POM may not be this projects POM&#xff0c;報的是那個jar 包&#xff0c;就刪除那個jar 包&#xff0c;重新mvn clean install .ok

Java并發編程之FutureTask源碼解析

上次總結一下AQS的一些相關知識&#xff0c;這次總結了一下FutureTask的東西&#xff0c;相對于AQS來說簡單好多呀 之前提到過一個LockSupport的工具類&#xff0c;也了解一下這個工具類的用法&#xff0c;這里也鞏固一下吧 /*** Makes available the permit for the given th…

java 刪除二維數組中的null_避免在Java中檢查Null語句

1.概述通常&#xff0c;在Java代碼中處理null變量、引用和集合很棘手。它們不僅難以識別&#xff0c;而且處理起來也很復雜。事實上&#xff0c;在編譯時無法識別處理null的任何錯誤&#xff0c;會導致運行時NullPointerException。在本教程中&#xff0c;我們將了解在Java中檢…

Java并發編程之并發容器ConcurrentHashMap(JDK1.7)解析

最近看了一下ConcurrentHashMap的相關代碼&#xff0c;感覺JDK1.7和JDK1.8差別挺大的&#xff0c;這次先看下JDK1.7是怎么實現的吧 哈希&#xff08;hash&#xff09; 先了解一下啥是哈希&#xff08;網上有很多介紹&#xff09;&#xff0c;是一種散列函數&#xff0c;簡單來…

帶控制端的邏輯運算電路_分別完成正整數的平方、立方和階乘的運算verilog語言...

練習&#xff1a;設計一個帶控制端的邏輯運算電路&#xff0c;分別完成正整數的平方、立方和階乘的運算。 //--------------myfunction---------- modulemyfunction(clk,n,result,reset,sl); output[6:0]result; input[2:0] n; input reset,clk; input [1:0] sl; reg[6:0]resul…