Java多執行緒-FutureTask的get方法阻塞問題
FutureTask類中get方法阻塞的問題:
get方法的實現:
/**
* @throws CancellationException {@inheritDoc}
*/
public V get() throws InterruptedException, ExecutionException {
int s = state;
if (s <= COMPLETING)
s = awaitDone(false, 0L);
return report(s);
}
這裡的state是執行緒完成的標誌,執行緒完成之後該state為2。執行緒啟動之前該值為1。
COMPLETING的值為1。
s <= COMPLETING表示當前執行緒還未執行完。就呼叫awaitDone方法。
awaitDone方法中:
第一個引數:timed true if use timed waits,為false表示不使用timed waits,意思是不設定超時時間,如果執行緒未完成,會一直阻塞。
第二個引數:nanos time ,等待的時間。
awaitDone方法的實現:
/** * Awaits completion or aborts on interrupt or timeout. * * @param timed true if use timed waits * @param nanos time to wait, if timed * @return state upon completion */ private int awaitDone(boolean timed, long nanos) throws InterruptedException { final long deadline = timed ? System.nanoTime() + nanos : 0L; WaitNode q = null; boolean queued = false; for (;;) { if (Thread.interrupted()) { removeWaiter(q); throw new InterruptedException(); } int s = state; if (s > COMPLETING) { if (q != null) q.thread = null; return s; } else if (s == COMPLETING) // cannot time out yet Thread.yield(); else if (q == null) q = new WaitNode(); else if (!queued) queued = UNSAFE.compareAndSwapObject(this, waitersOffset, q.next = waiters, q); else if (timed) { nanos = deadline - System.nanoTime(); if (nanos <= 0L) { removeWaiter(q); return state; } LockSupport.parkNanos(this, nanos); } else LockSupport.park(this); } }
相關推薦
java多執行緒11.非阻塞同步機制
關於非阻塞演算法CAS。 比較並交換CAS:CAS包含了3個運算元---需要讀寫的記憶體位置V,進行比較的值A和擬寫入的新值B。當且僅當V的值等於A時,CAS才會通過原子的方式用新值B來更新V的值,否則不會執行任何操作。無論位置V的值是否等於A,都將返回V原有的值。然後執行緒可以基於新返回的V值來做對應的操作
多執行緒學習(4):三種實現Java多執行緒的方法:Thread、Callable和Runable 的比較與區別
2018年10月03日 目錄 前言 前言 JVM允許應用程式併發執行多執行緒:最常用的是兩個方法:(1)基礎Thread類,重寫run()方法;(2)或實現Runnable 介面,實現介面的run()方法;(3)另外一種方法是:實現callable 介面
Java多執行緒程式設計---java5阻塞佇列
java5阻塞佇列的應用 佇列包含固定長度的佇列和不固定長度的佇列,先進先出。 固定長度的佇列往裡放資料,如果放滿了還要放,阻塞式佇列就會等待,直到有資料取出,空出位置後才繼續放;非阻塞式佇列不能等待就只能報錯了。 講Conditio
Java多執行緒程式非阻塞式鎖定實現
Java對多執行緒程式的鎖定已經有良好的支援,通常使用synchronized修飾一個方法或者一段程式碼。但是有一個問題,多個執行緒同時呼叫同一個方法的時候,所有執行緒都被排隊處理了。該被呼叫的方法越耗時,執行緒越多的時候,等待的執行緒等待的時間也就越
JAVA多執行緒 join() 方法詳解及應用場景
在某些情況下,主執行緒建立並啟動了子執行緒,如果子執行緒中需要進行大量的耗時運算,主執行緒往往將早於子執行緒結束之前結束,如果主執行緒想等待子執行緒執行完畢後,獲得子執行緒中的處理完的某個資料,就要用
java多執行緒join方法
在某些情況下,主執行緒建立並啟動了子執行緒,如果子執行緒中需要進行大量的耗時運算,主執行緒往往將早於子執行緒結束之前結束,如果主執行緒想等待子執行緒執行完畢後,獲得子執行緒中的處理完的某個
Java多執行緒中的阻塞佇列和併發集合
本章主要探討在多執行緒程式中與集合相關的內容。在多執行緒程式中,如果使用普通集合往往會造成資料錯誤,甚至造成程式崩潰。Java為多執行緒專門提供了特有的執行緒安全的集合類,通過下面的學習,您需要掌握這些集合的特點是什麼,底層實現如何、在何時使用等問題。 3.1 Blo
java多執行緒-join方法詳解(附面試題)
本文對java Thread中join()方法進行介紹,join()的作用是讓“主執行緒”等待“子執行緒”結束之後才能繼續執行,大家參考使用吧 本章涉及到的內容包括: 1. join()
Java 多執行緒 yield方法
yield()方法 理論上,yield意味著放手,放棄,投降。一個呼叫yield()方法的執行緒告訴虛擬機器它樂意讓其他執行緒佔用自己的位置。這表明該執行緒沒有在做一些緊急的事情。注意,這僅是一個暗示,並不能保證不會產生任何影響。 在Thread.java中yield()定
java多執行緒使用BlockingQueue阻塞佇列實現互斥同步通訊
package com.study; import java.util.concurrent.ArrayBlockingQu
Java多執行緒-FutureTask的get方法阻塞問題
FutureTask類中get方法阻塞的問題: get方法的實現: /** * @throws CancellationException {@inheritDoc} */ public V get() throws Interrupte
Java 多執行緒 join和interrupt 方法
簡述: 使用Java多執行緒中join和interrupt函式 《Java程式設計思想》 P669 ~ P670 一個執行緒可以再其他執行緒上呼叫join()方法,其效果是等待一段時間直到第二個執行緒結束才繼續執行。 如果某個執行緒在另一個執行緒t上呼叫t.join(), 此
Java多執行緒之join()方法
概要 本章,會對Thread中join()方法進行介紹。涉及到的內容包括: 1. join()介紹 2. join()原始碼分析(基於JDK1.7.0_40) 3. join()示例 來源:http://www.cnblogs.com/skywang12345/p/34792
白話理解java多執行緒之join()方法
join字面意思是加入,我理解為插隊. 舉例:媽媽在炒菜,發現沒喲醬油了,讓兒子去打醬油,兒子打完醬油,媽媽炒完菜,全家一起吃 package cn.yh.thread01; /** * * 打醬油的例子 */ public class Demo03 { public stat
Java多執行緒-44-靜態和非靜態方法同步鎖物件是什麼
前面一篇,我們知道了synchronized關鍵字擴起來範圍的程式碼塊就可以實現同步,其實,在Java中,只需要在方法上加上synchronized關鍵字即可,就像加上static一樣。本篇來看看加上synchronized關鍵字修飾的非靜態和靜態方法的同步鎖物件是什麼。 1.非靜態同步鎖物
Java多執行緒學習筆記(二) synchronized同步方法-防止髒讀
1. 髒讀 在給一個物件賦值的時候進行了同步, 但是在取值的時候可能出現意外,此值已經被其他執行緒修改了,這種情況就是髒讀 1.1 PublicVar類 public class PublicVar { public String userName = "wang don
Java多執行緒學習筆記(一) synchronized同步方法
synchronized同步方法 1.提出問題-例項變數非執行緒安全 1.1 何為非執行緒安全? 1.2 舉例 1.2.1 有私有變數的類HasPrivateNum (供多執行緒們去呼叫) 1.2.2 執行緒A
Java多執行緒中注入Spring的Bean-使用靜態方法直接取的容器中的spring物件
目前認為比較好的解決方案。 1,工具類 public class SpringApplicationContextHolder implements ApplicationContextAware { private static ApplicationContext context
Java併發(十八):阻塞佇列BlockingQueue BlockingQueue(阻塞佇列)詳解 二叉堆(一)之 圖文解析 和 C語言的實現 多執行緒程式設計:阻塞、併發佇列的使用總結 Java併發程式設計:阻塞佇列 java阻塞佇列 BlockingQueue(阻塞佇列)詳解
阻塞佇列(BlockingQueue)是一個支援兩個附加操作的佇列。 這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。 阻塞佇列常用於生產者和消費者的場景,生產者是往佇列裡新增元素的執行緒,消費者是從佇列裡拿元素的執行緒。阻塞佇列就是生產者
java 多執行緒synchronized鎖同步方法,同步程式碼塊
執行緒安全問題 同步和非同步 我們知道多個執行緒共享堆記憶體,當兩個或者多個執行緒呼叫同一個物件的方法操作物件成員時,因為cpu輪流執行執行緒,執行緒A剛開始操作物件方法,修改了資料,輪到執行緒B執行,執行緒B也操作物件方法,修改資料,可能又輪到執行緒A操作物件方法,接著上次執行緒A的剩餘部