摘要:可以用代替可以用代替定義的對象的值是不可變的今天就先到這里,大家可以看看這些內容的拓展記得點關注看更新,謝謝閱讀
前言
java高并發第二篇講的是java線程的基礎
依舊不多說廢話
進程是操作系統運行的基礎,是一個程序運行的實體,windows上打開任務管理器就能看到進程
線程是輕量級的進程,是程序執行的最小單位,是在進程這個容器下進行的
新建一個線程類有兩種方式: extends Thread implement Runnable
推薦使用Runnable接口(這不廢話嗎)
1.創建線程
Thread t1 = new Thread(){ @Ovveride public void run(){ System.out.println("create"); } t1.start();
重構run()方法,用start()啟動線程
2.終止線程
Thread.stop();
不推薦stop,強行終止不能保證原子性
這里給大家寫一個終止線程的推薦方法:
public class interruptTest { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(){ public void run(){ while (true){ System.out.println("go"); if (Thread.currentThread().isInterrupted()){ break; } } } }; t1.start(); Thread.sleep(10001); t1.interrupt(); } }
看懂了嗎?
方法解釋:
interrupt和stop不同的是,stop會立即中斷線程,而interrupt的中斷線程由線程自己決定
Thread.interrupt() //設置中斷標志 Thread.isInterrupted() //判斷當前線程是否有中斷標志,如果有,返回true
sleep()也能讓線程暫時性的中斷,即讓線程休眠
3.線程協作之等待和通知
多線程之間的協作可以使用等待(wait())和通知(notify)進行
wait和notify不能亂用,它們必須包含在synchronzied(即同步)的方法中
無論是wait還是notify,都需要一個目標對象的監聽器(也叫鎖)
當線程1在一個同步的object對象中運行的時候,突然執行object.wait()方法,此時線程停止執行,并且退出object對象,釋放對象的監聽器,線程1進入等待隊列
接著線程2進入object對象,首先拿到object對象的監聽器,當線程2執行object.notify()方法時,對象object會隨機選擇一個等待隊列中的線程,并將其喚醒,然后線程2釋放監聽器,那個被喚醒的線程就會進來
用圖更形象:
4.線程協作之結束和謙讓
多線程之間的協作可以使用結束(join())和謙讓(yield())進行
join()方法就是讓一個線程加入到另一個線程,至于怎么個加入法看下面一個例子:
public class JoinTest { public volatile static int i=0; public static class JoinThread extends Thread{ @Override public void run(){ for (i=0;i<1000;i++){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) throws InterruptedException { JoinThread joinThread = new JoinThread(); joinThread.start(); System.out.println(i); } }
這個方法打印出來的i大家肯定知道,一定是0,因為我們在這個類的主線程里執行,雖然joinThread和主線程一起執行了,但是主線程并不會去理會joinThread,只管執行打印代碼:
再來看看加入join()后的結果:
現在很容易理解了,因為joinThread線程加入到了主線程中,joinThread的join()讓主線程去等待它完成才執行打印,所以會打印出1000
yield()是謙讓,字面意思,就是我已經完成一些最重要的事情了,不想再占著CPU資源,需要休息啊一下,但是能否被分配到CPU資源就不一定了
守護線程守護線程是在后臺默默完成系統服務的線程,如垃圾回收線程,JIT線程
與之相應的是用戶線程,也就是用戶完成業務要用的線程
當一個java程序中只剩守護線程的時候,JVm就會自然退出
下面用一段代碼證明:
代碼new Thread().setDaemon(true);就是設置為守護線程
public class DaemonTest { public static class DaemonT extends Thread{ public void run(){ while (true){ System.out.println("我還在"); try { Thread.sleep(100); } catch (InterruptedException e) { } } } } public static void main(String[] args) throws InterruptedException { DaemonT daemonT = new DaemonT(); daemonT.setDaemon(true); daemonT.start(); Thread.sleep(2000); } }
上面代碼在主線程運行兩秒后,自動關閉應用,因為只有守護線程
線程優先級設置java的線程優先級可以用1-10表示
數字越高表示優先級越高
Thread thread1 = new Thread(); thread.setPriority(10);
這樣thread1線程的優先級就是最高的
線程安全與synchronized為了保證線程安全,我們之前講過可以使用volatile保證變量可見性
但是volatile并不能真正的保證線程的安全
使用synchronized保證線程安全,synchronized會在對象上加鎖
使同一時間只能有一個線程進入該對象
synchronized的用法整理:
指定加鎖對象:對給定對象加鎖,進入同步代碼前獲得給定對象的鎖 直接作用于實例方法:相當于對當前實例加鎖 直接作用于靜態(static)方法,相當于給當前類加鎖
所以要注意在同個線程指定的監聽對象是new Test()還是test實例
TipsHashMap的多線程編程是不安全的,可能導致機子死機,兩個線程交互next會進入死循環。可以用ConcurrentHashMap代替
ArrayList可以用Vector代替
Integer定義的對象的值是不可變的
今天就先到這里,大家可以看看這些內容的拓展
記得點關注看更新,謝謝閱讀
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70635.html
摘要:今天就先到這里,大家可以看看這些內容的拓展記得點關注看更新,謝謝閱讀 前言 這是一個長篇博客,希望大家關注我并且一起學習java高并發廢話不多說,直接開始 并行和并發 并行:多個線程同時處理多個任務并發:多個線程處理同個任務,不一定要同時 下面用圖來描述并行和并發的區別:(實現和虛線表示兩個不同的線程) showImg(https://segmentfault.com/img/bVYT...
摘要:前言今天講的多線程的同步控制直接進入正題重入鎖重入鎖可以完全代替,它需要類來實現下面用一個簡單的例子來實現重入鎖以上代碼打印出來的是,可以說明也實現了線程同步它相比更加靈活,因為重入鎖實現了用戶自己加鎖,自己釋放鎖記得一定要釋放,不然其他線 前言 今天講的多線程的同步控制直接進入正題 ReentrantLock重入鎖 重入鎖可以完全代替synchronized,它需要java.util...
摘要:前言這篇主要來講解多線程中一個非常經典的設計模式包括它的基礎到拓展希望大家能夠有所收獲生產者消費者模式簡述此設計模式中主要分兩類線程生產者線程和消費者線程生產者提供數據和任務消費者處理數據和任務該模式的核心就是數據和任務的交互點共享內存緩 前言 這篇主要來講解多線程中一個非常經典的設計模式包括它的基礎到拓展希望大家能夠有所收獲 生產者-消費者模式簡述 此設計模式中主要分兩類線程:生產者...
摘要:前言本篇主要講解如何去優化鎖機制或者克服多線程因為鎖可導致性能下降的問題線程變量有這樣一個場景,前面是一大桶水,個人去喝水,為了保證線程安全,我們要在杯子上加鎖導致大家輪著排隊喝水,因為加了鎖的杯子是同步的,只能有一個人拿著這個唯一的杯子喝 前言 本篇主要講解如何去優化鎖機制或者克服多線程因為鎖可導致性能下降的問題 ThreadLocal線程變量 有這樣一個場景,前面是一大桶水,10個...
閱讀 2849·2021-11-22 11:56
閱讀 3553·2021-11-15 11:39
閱讀 898·2021-09-24 09:48
閱讀 759·2021-08-17 10:14
閱讀 1322·2019-08-30 15:55
閱讀 2753·2019-08-30 15:55
閱讀 1310·2019-08-30 15:44
閱讀 2775·2019-08-30 10:59