国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

新手場景Java線程相關(guān)問題及解決方案

瀏覽:78日期:2022-08-30 08:31:45

一、創(chuàng)建線程方式

a. 繼承線程類( new Thread),重寫run方法;

public class MyThread extends Thread{//繼承Thread類public void run(){//重寫run方法}}public class Main {public static void main(String[] args){new MyThread().start();//創(chuàng)建并啟動線程}}

b. 實現(xiàn)runnable接口,將runnable對象傳入Thread類;

public class MyThread2 implements Runnable {//實現(xiàn)Runnable接口public void run(){//重寫run方法}}public class Main {public static void main(String[] args){//創(chuàng)建并啟動線程MyThread2 myThread=new MyThread2();Thread thread=new Thread(myThread);thread().start();//或者 new Thread(new MyThread2()).start();}}

c. 使用線程池的方式,提交runnable或callable任務(wù);

public class Main {public static void main(String[] args){ MyThread3 th=new MyThread3(); //使用Lambda表達式創(chuàng)建Callable對象 //使用FutureTask類來包裝Callable對象 FutureTask<Integer> future=new FutureTask<Integer>((Callable<Integer>)()->{return 5;} ); new Thread(task,'有返回值的線程').start();//實質(zhì)上還是以Callable對象來創(chuàng)建并啟動線程 try{System.out.println('子線程的返回值:'+future.get());//get()方法會阻塞,直到子線程執(zhí)行結(jié)束才返回 }catch(Exception e){ex.printStackTrace(); }}}

d. 推薦使用第三種方式。高效,資源可控;

二、什么是線程同步?線程同步什么時候用?

1)什么是線程同步;

即當有一個線程在對內(nèi)存進行操作時,其他線程都不可以對這個內(nèi)存地址進行操作,直到該線程完成操作, 其他線程才能對該內(nèi)存地址進行操作,而其他線程又處于等待狀態(tài);

2)線程同步在什么時候用(賣火車票,飛機票,取錢);

簡單的說,同步就是防止多個線程訪問同一個對象,造成數(shù)據(jù)不安全;線程的同步意味安全,譬如你去取錢 ,你的執(zhí)行語句和我用的要是相同對象 ,你要在卡上扣除的錢數(shù)和銀行卡里面要有這么多錢才能扣除;

三、什么是線程安全;

1)所謂線程安全,是多個線程并發(fā)執(zhí)行的情況下結(jié)果總是跟單線程運行的結(jié)果一致,邏輯上不會出現(xiàn)錯誤;

2)什么情況下會出現(xiàn)線程安全問題?

多個線程同時操作同一份數(shù)據(jù),常常會導(dǎo)致線程安全問題。比如:全局的變量,靜態(tài)變量,同一條數(shù)據(jù)的數(shù)據(jù)庫操作等;

局部變量,通常不會存在線程安全問題。

3)常見的解決線程安全的方式:

1)避免使用全局的變量,將全局的變量定義為局部變量。

2)加同步鎖,使得線程同步。

a. Synchronized 同步關(guān)鍵字,可以加在方法和代碼塊上面;

/** * synchronized添加到方法上面,使方法變成同步方法 * 如果是靜態(tài)方法,鎖住的是class * 如果是普通方法,鎖住的this,當前對象 synchronized(this) * 多個線程鎖住的對象是同一個對象才能夠同步,每個類都有當前對象 */ public static synchronized void salTicket(){ if (ticketNum > 0) { try {Thread.sleep(100); } catch (InterruptedException e) {e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + '買到第' + ticketNum-- + '張票'); System.out.println(Thread.currentThread().getName() + '買票完成'); }else { System.out.println('票已經(jīng)售完,'+Thread.currentThread().getName() + '未買到票'); } }

b. 多個線程方法是否同步,需要判斷多個線程是否共用同一把鎖;

/** * 同步代碼塊 */ public void salTicket2() { synchronized (this) { //()中指定鎖對象,this表示當前對象,多個線程使用同一個對象調(diào)用該方法時,是同步的 //如果指定為 class,則該類的任意對象調(diào)用該方法都是同步的 if (ticketNum > 0) {try { Thread.sleep(100);} catch (InterruptedException e) { e.printStackTrace();}System.out.println(Thread.currentThread().getName() + '買到第' + ticketNum-- + '張票');System.out.println(Thread.currentThread().getName() + '買票完成'); } else {System.out.println('票已經(jīng)售完,' + Thread.currentThread().getName() + '未買到票'); } } }

c. ReentrantLock 對象的lock 方法進行加鎖,unLock進行解鎖。Unlock必須放在finally中。確保能夠最終釋放鎖;

//鎖對象 private static ReentrantLock lock=new ReentrantLock(); /** * 使用lock對象進行同步,多個線程使用的是同一個lock對象,才會是同步的 */ public void salTicket3() { lock.lock();//加鎖 if (ticketNum > 0) {try { Thread.sleep(100);} catch (InterruptedException e) { e.printStackTrace();}finally { lock.unlock();//釋放鎖,必須放在finally代碼塊中,以確保能夠釋放鎖}System.out.println(Thread.currentThread().getName() + '買到第' + ticketNum-- + '張票');System.out.println(Thread.currentThread().getName() + '買票完成'); } else {System.out.println('票已經(jīng)售完,' + Thread.currentThread().getName() + '未買到票'); } }

3)數(shù)據(jù)庫操作的話,也可以使用樂觀鎖或悲觀鎖的方式

4)Springmvc是如何解決線程安全問題的?

Springmvc的數(shù)據(jù)接收和傳遞都是方法級別的,使用局部變量來接收和傳遞,所以不存在線程安全問題。

四、Wait 和notify

線程間通訊的一種機制。用于手動控制線程之間的切換。在同步代碼中的鎖對象調(diào)用。可以同時通過共享內(nèi)存對象,來實現(xiàn)數(shù)據(jù)的傳遞;

Wait 使線程進入阻塞狀態(tài),并釋放鎖資源; Notify 隨機喚醒一個因wait進入阻塞狀態(tài)的線程; NotifyALL 喚醒所有的因wait進入阻塞狀態(tài)的線程;

3)多線程實現(xiàn),怎么用?

a、將單個大的任務(wù)拆分成多個小任務(wù),使用多線程去執(zhí)行;

多線程的效率不一定比單線程的效率高;

通過線程池創(chuàng)建線程,通過實現(xiàn)runnable(無返回值)或callable(有返回值)接口來定義任務(wù);

通過線程池的submit invoke invokeAll 等方法來執(zhí)行任務(wù);

b、使用線程異步完成某些任務(wù),提高并發(fā)響應(yīng)的能力,或讓線程周期性的執(zhí)行某些任務(wù);

c、四種線程池的特點及其創(chuàng)建;

Java通過Executors提供四種線程池,分別為:

1)newCachedThreadPool創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。

2)newFixedThreadPool 創(chuàng)建一個定長線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待。

3)newScheduledThreadPool 創(chuàng)建一個定長線程池,支持定時及周期性任務(wù)執(zhí)行。

4)newSingleThreadExecutor 創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。

//jdk中提供的四種快速創(chuàng)建線程池的方式 //1.定長線程池 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10); //2.緩存線程池 ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); //3.周期線程池,可用來實現(xiàn)定時任務(wù) ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10); //4.單線程線程池 ExecutorService executorService = Executors.newSingleThreadExecutor();

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 日本在线免费观看视频 | 亚洲国产欧美在线成人aaaa | 中文字幕一区日韩在线视频 | 一区二区三区免费视频观看 | 成人在免费视频手机观看网站 | 亚洲精品美女 | 亚洲精品一区二区三区中文字幕 | 久久久久久免费精品视频 | 亚洲天堂网在线观看 | 手机看片国产欧美日韩高清 | 国产精品yjizz视频网一二区 | 欧美特欧美特级一片 | 国产三级在线视频观看 | 国产私拍福利精品视频推出 | 欧美在线三级 | 手机看片免费基地你懂的 | 日韩美女免费视频 | 成年人毛片视频 | 在线播放亚洲精品 | ccav在线永久免费看 | 亚洲精品成人网 | 91国内精品久久久久免费影院 | 日韩国产欧美一区二区三区在线 | 欧美精品人爱c欧美精品 | 欧美人成人亚洲专区中文字幕 | 欧美 亚洲 在线 | 免费高清国产 | a站在线观看 | 91精品一区二区三区在线观看 | 亚洲综合色就色手机在线观看 | 怡红院在线观看视频 | 日韩三级中文字幕 | 毛片网站免费在线观看 | 国产精选一区二区 | 综合91| 最新国产精品好看的国产精品 | 人成午夜| 色樱桃影院亚洲精品影院 | 男人的天堂久久香蕉国产 | 久久久一本| 男人天堂视频在线 |