java常用的幾種線程池比較

1. 為什么使用線程池

諸如 Web 服務(wù)器拓春、數(shù)據(jù)庫服務(wù)器组哩、文件服務(wù)器或郵件服務(wù)器之類的許多服務(wù)器應(yīng)用程序都面向處理來自某些遠(yuǎn)程來源的大量短小的任務(wù)糟秘。請求以某種方式到達(dá)服務(wù)器憔杨,這種方式可能是通過網(wǎng)絡(luò)協(xié)議(例如 HTTP蘸拔、FTP 或 POP)、通過 JMS 隊(duì)列或者可能通過輪詢數(shù)據(jù)庫负芋。不管請求如何到達(dá)漫蛔,服務(wù)器應(yīng)用程序中經(jīng)常出現(xiàn)的情況是:單個(gè)任務(wù)處理的時(shí)間很短而請求的數(shù)目卻是巨大的。

構(gòu)建服務(wù)器應(yīng)用程序的一個(gè)簡單模型是:每當(dāng)一個(gè)請求到達(dá)就創(chuàng)建一個(gè)新線程旧蛾,然后在新線程中為請求服務(wù)莽龟。實(shí)際上對于原型開發(fā)這種方法工作得很好,但如果試圖部署以這種方式運(yùn)行的服務(wù)器應(yīng)用程序锨天,那么這種方法的嚴(yán)重不足就很明顯毯盈。每個(gè)請求對應(yīng)一個(gè)線程(thread-per-request)方法的不足之一是:為每個(gè)請求創(chuàng)建一個(gè)新線程的開銷很大;為每個(gè)請求創(chuàng)建新線程的服務(wù)器在創(chuàng)建和銷毀線程上花費(fèi)的時(shí)間和消耗的系統(tǒng)資源要比花在處理實(shí)際的用戶請求的時(shí)間和資源更多病袄。

除了創(chuàng)建和銷毀線程的開銷之外搂赋,活動(dòng)的線程也消耗系統(tǒng)資源赘阀。在一個(gè) JVM 里創(chuàng)建太多的線程可能會(huì)導(dǎo)致系統(tǒng)由于過度消耗內(nèi)存而用完內(nèi)存或“切換過度”。為了防止資源不足脑奠,服務(wù)器應(yīng)用程序需要一些辦法來限制任何給定時(shí)刻處理的請求數(shù)目基公。

線程池為線程生命周期開銷問題和資源不足問題提供了解決方案。通過對多個(gè)任務(wù)重用線程捺信,線程創(chuàng)建的開銷被分?jǐn)偟搅硕鄠€(gè)任務(wù)上。其好處是欠痴,因?yàn)樵谡埱蟮竭_(dá)時(shí)線程已經(jīng)存在迄靠,所以無意中也消除了線程創(chuàng)建所帶來的延遲。這樣喇辽,就可以立即為請求服務(wù)掌挚,使應(yīng)用程序響應(yīng)更快。而且菩咨,通過適當(dāng)?shù)卣{(diào)整線程池中的線程數(shù)目吠式,也就是當(dāng)請求的數(shù)目超過某個(gè)閾值時(shí),就強(qiáng)制其它任何新到的請求一直等待抽米,直到獲得一個(gè)線程來處理為止特占,從而可以防止資源不足。

2. 使用線程池的風(fēng)險(xiǎn)

雖然線程池是構(gòu)建多線程應(yīng)用程序的強(qiáng)大機(jī)制云茸,但使用它并不是沒有風(fēng)險(xiǎn)的是目。用線程池構(gòu)建的應(yīng)用程序容易遭受任何其它多線程應(yīng)用程序容易遭受的所有并發(fā)風(fēng)險(xiǎn),諸如同步錯(cuò)誤和死鎖标捺,它還容易遭受特定于線程池的少數(shù)其它風(fēng)險(xiǎn)懊纳,諸如與池有關(guān)的死鎖、資源不足和線程泄漏亡容。

2.1 死鎖

任何多線程應(yīng)用程序都有死鎖風(fēng)險(xiǎn)嗤疯。當(dāng)一組進(jìn)程或線程中的每一個(gè)都在等待一個(gè)只有該組中另一個(gè)進(jìn)程才能引起的事件時(shí),我們就說這組進(jìn)程或線程 死鎖了闺兢。死鎖的最簡單情形是:線程 A 持有對象 X 的獨(dú)占鎖茂缚,并且在等待對象 Y 的鎖,而線程 B 持有對象 Y 的獨(dú)占鎖屋谭,卻在等待對象 X 的鎖阱佛。除非有某種方法來打破對鎖的等待(Java 鎖定不支持這種方法),否則死鎖的線程將永遠(yuǎn)等下去戴而。

雖然任何多線程程序中都有死鎖的風(fēng)險(xiǎn)凑术,但線程池卻引入了另一種死鎖可能,在那種情況下所意,所有池線程都在執(zhí)行已阻塞的等待隊(duì)列中另一任務(wù)的執(zhí)行結(jié)果的任務(wù)淮逊,但這一任務(wù)卻因?yàn)闆]有未被占用的線程而不能運(yùn)行催首。當(dāng)線程池被用來實(shí)現(xiàn)涉及許多交互對象的模擬,被模擬的對象可以相互發(fā)送查詢泄鹏,這些查詢接下來作為排隊(duì)的任務(wù)執(zhí)行郎任,查詢對象又同步等待著響應(yīng)時(shí),會(huì)發(fā)生這種情況备籽。

2.2 資源不足

線程池的一個(gè)優(yōu)點(diǎn)在于:相對于其它替代調(diào)度機(jī)制(有些我們已經(jīng)討論過)而言舶治,它們通常執(zhí)行得很好。但只有恰當(dāng)?shù)卣{(diào)整了線程池大小時(shí)才是這樣的车猬。線程消耗包括內(nèi)存和其它系統(tǒng)資源在內(nèi)的大量資源霉猛。除了 Thread 對象所需的內(nèi)存之外,每個(gè)線程都需要兩個(gè)可能很大的執(zhí)行調(diào)用堆棧珠闰。除此以外惜浅,JVM 可能會(huì)為每個(gè) Java 線程創(chuàng)建一個(gè)本機(jī)線程,這些本機(jī)線程將消耗額外的系統(tǒng)資源伏嗜。最后坛悉,雖然線程之間切換的調(diào)度開銷很小,但如果有很多線程承绸,環(huán)境切換也可能嚴(yán)重地影響程序的性能裸影。

如果線程池太大,那么被那些線程消耗的資源可能嚴(yán)重地影響系統(tǒng)性能军熏。在線程之間進(jìn)行切換將會(huì)浪費(fèi)時(shí)間空民,而且使用超出比您實(shí)際需要的線程可能會(huì)引起資源匱乏問題,因?yàn)槌鼐€程正在消耗一些資源羞迷,而這些資源可能會(huì)被其它任務(wù)更有效地利用界轩。除了線程自身所使用的資源以外,服務(wù)請求時(shí)所做的工作可能需要其它資源衔瓮,例如 JDBC 連接浊猾、套接字或文件。這些也都是有限資源热鞍,有太多的并發(fā)請求也可能引起失效葫慎,例如不能分配 JDBC 連接。

2.3 并發(fā)錯(cuò)誤

線程池和其它排隊(duì)機(jī)制依靠使用 wait() 和 notify() 方法薇宠,這兩個(gè)方法都難于使用偷办。如果編碼不正確,那么可能丟失通知澄港,導(dǎo)致線程保持空閑狀態(tài)椒涯,盡管隊(duì)列中有工作要處理。使用這些方法時(shí)回梧,必須格外小心废岂。而最好使用現(xiàn)有的祖搓、已經(jīng)知道能工作的實(shí)現(xiàn),例如 util.concurrent 包湖苞。

2.4 線程泄漏

各種類型的線程池中一個(gè)嚴(yán)重的風(fēng)險(xiǎn)是線程泄漏拯欧,當(dāng)從池中除去一個(gè)線程以執(zhí)行一項(xiàng)任務(wù),而在任務(wù)完成后該線程卻沒有返回池時(shí)财骨,會(huì)發(fā)生這種情況镐作。發(fā)生線程泄漏的一種情形出現(xiàn)在任務(wù)拋出一個(gè) RuntimeException 或一個(gè) Error 時(shí)。如果池類沒有捕捉到它們隆箩,那么線程只會(huì)退出而線程池的大小將會(huì)永久減少一個(gè)该贾。當(dāng)這種情況發(fā)生的次數(shù)足夠多時(shí),線程池最終就為空摘仅,而且系統(tǒng)將停止靶庙,因?yàn)闆]有可用的線程來處理任務(wù)问畅。

有些任務(wù)可能會(huì)永遠(yuǎn)等待某些資源或來自用戶的輸入娃属,而這些資源又不能保證變得可用,用戶可能也已經(jīng)回家了护姆,諸如此類的任務(wù)會(huì)永久停止矾端,而這些停止的任務(wù)也會(huì)引起和線程泄漏同樣的問題。如果某個(gè)線程被這樣一個(gè)任務(wù)永久地消耗著卵皂,那么它實(shí)際上就被從池除去了秩铆。對于這樣的任務(wù),應(yīng)該要么只給予它們自己的線程灯变,要么只讓它們等待有限的時(shí)間殴玛。

2.5 請求過載

僅僅是請求就壓垮了服務(wù)器,這種情況是可能的添祸。在這種情形下滚粟,我們可能不想將每個(gè)到來的請求都排隊(duì)到我們的工作隊(duì)列,因?yàn)榕旁陉?duì)列中等待執(zhí)行的任務(wù)可能會(huì)消耗太多的系統(tǒng)資源并引起資源缺乏刃泌。在這種情形下決定如何做取決于您自己凡壤;在某些情況下,您可以簡單地拋棄請求耙替,依靠更高級別的協(xié)議稍后重試請求亚侠,您也可以用一個(gè)指出服務(wù)器暫時(shí)很忙的響應(yīng)來拒絕請求。

3.有效使用線程池的準(zhǔn)則

只要您遵循幾條簡單的準(zhǔn)則俗扇,線程池可以成為構(gòu)建服務(wù)器應(yīng)用程序的極其有效的方法:

不要對那些同步等待其它任務(wù)結(jié)果的任務(wù)排隊(duì)硝烂。這可能會(huì)導(dǎo)致上面所描述的那種形式的死鎖,在那種死鎖中铜幽,所有線程都被一些任務(wù)所占用钢坦,這些任務(wù)依次等待排隊(duì)任務(wù)的結(jié)果究孕,而這些任務(wù)又無法執(zhí)行,因?yàn)樗械木€程都很忙爹凹。

在為時(shí)間可能很長的操作使用合用的線程時(shí)要小心厨诸。如果程序必須等待諸如 I/O 完成這樣的某個(gè)資源,那么請指定最長的等待時(shí)間禾酱,以及隨后是失效還是將任務(wù)重新排隊(duì)以便稍后執(zhí)行微酬。這樣做保證了:通過將某個(gè)線程釋放給某個(gè)可能成功完成的任務(wù),從而將最終取得某些進(jìn)展颤陶。

理解任務(wù)颗管。要有效地調(diào)整線程池大小,您需要理解正在排隊(duì)的任務(wù)以及它們正在做什么滓走。它們是 CPU 限制的(CPU-bound)嗎垦江?它們是 I/O 限制的(I/O-bound)嗎?您的答案將影響您如何調(diào)整應(yīng)用程序搅方。如果您有不同的任務(wù)類比吭,這些類有著截然不同的特征,那么為不同任務(wù)類設(shè)置多個(gè)工作隊(duì)列可能會(huì)有意義姨涡,這樣可以相應(yīng)地調(diào)整每個(gè)池衩藤。

4. 線程池的大小設(shè)置

調(diào)整線程池的大小基本上就是避免兩類錯(cuò)誤:線程太少或線程太多。幸運(yùn)的是涛漂,對于大多數(shù)應(yīng)用程序來說赏表,太多和太少之間的余地相當(dāng)寬。

請回憶:在應(yīng)用程序中使用線程有兩個(gè)主要優(yōu)點(diǎn)匈仗,盡管在等待諸如 I/O 的慢操作瓢剿,但允許繼續(xù)進(jìn)行處理,并且可以利用多處理器悠轩。在運(yùn)行于具有 N 個(gè)處理器機(jī)器上的計(jì)算限制的應(yīng)用程序中间狂,在線程數(shù)目接近 N 時(shí)添加額外的線程可能會(huì)改善總處理能力,而在線程數(shù)目超過 N 時(shí)添加額外的線程將不起作用哗蜈。事實(shí)上前标,太多的線程甚至?xí)档托阅埽驗(yàn)樗鼤?huì)導(dǎo)致額外的環(huán)境切換開銷距潘。

線程池的最佳大小取決于可用處理器的數(shù)目以及工作隊(duì)列中的任務(wù)的性質(zhì)炼列。若在一個(gè)具有 N 個(gè)處理器的系統(tǒng)上只有一個(gè)工作隊(duì)列,其中全部是計(jì)算性質(zhì)的任務(wù)音比,在線程池具有 N 或 N+1 個(gè)線程時(shí)一般會(huì)獲得最大的 CPU 利用率俭尖。

對于那些可能需要等待 I/O 完成的任務(wù)(例如,從套接字讀取 HTTP 請求的任務(wù)),需要讓池的大小超過可用處理器的數(shù)目稽犁,因?yàn)椴⒉皇撬芯€程都一直在工作焰望。通過使用概要分析,您可以估計(jì)某個(gè)典型請求的等待時(shí)間(WT)與服務(wù)時(shí)間(ST)之間的比例已亥。如果我們將這一比例稱之為 WT/ST熊赖,那么對于一個(gè)具有 N 個(gè)處理器的系統(tǒng),需要設(shè)置大約 N*(1+WT/ST) 個(gè)線程來保持處理器得到充分利用虑椎。

處理器利用率不是調(diào)整線程池大小過程中的唯一考慮事項(xiàng)震鹉。隨著線程池的增長,您可能會(huì)碰到調(diào)度程序捆姜、可用內(nèi)存方面的限制传趾,或者其它系統(tǒng)資源方面的限制,例如套接字泥技、打開的文件句柄或數(shù)據(jù)庫連接等的數(shù)目浆兰。

5. 常用的幾種線程池

5.1 newCachedThreadPool

創(chuàng)建一個(gè)可緩存線程池,如果線程池長度超過處理需要珊豹,可靈活回收空閑線程簸呈,若無可回收,則新建線程平夜。

這種類型的線程池特點(diǎn)是:

工作線程的創(chuàng)建數(shù)量幾乎沒有限制(其實(shí)也有限制的,數(shù)目為Interger. MAX_VALUE), 這樣可靈活的往線程池中添加線程蝶棋。
如果長時(shí)間沒有往線程池中提交任務(wù)卸亮,即如果工作線程空閑了指定的時(shí)間(默認(rèn)為1分鐘)忽妒,則該工作線程將自動(dòng)終止。終止后兼贸,如果你又提交了新的任務(wù)段直,則線程池重新創(chuàng)建一個(gè)工作線程。
在使用CachedThreadPool時(shí)溶诞,一定要注意控制任務(wù)的數(shù)量鸯檬,否則,由于大量線程同時(shí)運(yùn)行螺垢,很有會(huì)造成系統(tǒng)癱瘓喧务。

package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
 public static void main(String[] args) {
  ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
  for (int i = 0; i < 10; i++) {
   final int index = i;
   try {
    Thread.sleep(index * 1000);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   cachedThreadPool.execute(new Runnable() {
    public void run() {
     System.out.println(index);
    }
   });
  }
 }
}

5.2 newFixedThreadPool

Fixed中文解釋為固定。結(jié)合在一起解釋固定的線程池枉圃,說的更全面點(diǎn)就是功茴,有固定數(shù)量線程的線程池。其corePoolSize=maximumPoolSize孽亲,且keepAliveTime為0坎穿,適合線程穩(wěn)定的場所。

創(chuàng)建一個(gè)指定工作線程數(shù)量的線程池。每當(dāng)提交一個(gè)任務(wù)就創(chuàng)建一個(gè)工作線程玲昧,如果工作線程數(shù)量達(dá)到線程池初始的最大數(shù)栖茉,則將提交的任務(wù)存入到池隊(duì)列中。

FixedThreadPool是一個(gè)典型且優(yōu)秀的線程池孵延,它具有線程池提高程序效率和節(jié)省創(chuàng)建線程時(shí)所耗的開銷的優(yōu)點(diǎn)吕漂。但是,在線程池空閑時(shí)尘应,即線程池中沒有可運(yùn)行任務(wù)時(shí)痰娱,它不會(huì)釋放工作線程,還會(huì)占用一定的系統(tǒng)資源菩收。

示例代碼如下:

package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
 public static void main(String[] args) {
  ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
  for (int i = 0; i < 10; i++) {
   final int index = i;
   fixedThreadPool.execute(new Runnable() {
    public void run() {
     try {
      System.out.println(index);
      Thread.sleep(2000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
   });
  }
 }
}

因?yàn)榫€程池大小為3梨睁,每個(gè)任務(wù)輸出index后sleep 2秒,所以每兩秒打印3個(gè)數(shù)字娜饵。
定長線程池的大小最好根據(jù)系統(tǒng)資源進(jìn)行設(shè)置如Runtime.getRuntime().availableProcessors()坡贺。

5.3 newSingleThreadExecutor

創(chuàng)建一個(gè)單線程化的Executor,即只創(chuàng)建唯一的工作者線程來執(zhí)行任務(wù)箱舞,它只會(huì)用唯一的工作線程來執(zhí)行任務(wù)遍坟,保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。如果這個(gè)線程異常結(jié)束晴股,會(huì)有另一個(gè)取代它愿伴,保證順序執(zhí)行。單工作線程最大的特點(diǎn)是可保證順序地執(zhí)行各個(gè)任務(wù)电湘,并且在任意給定的時(shí)間不會(huì)有多個(gè)線程是活動(dòng)的隔节。

Single中文解釋為單一。結(jié)合在一起解釋單一的線程池寂呛,說的更全面點(diǎn)就是怎诫,有固定數(shù)量線程的線程池,且數(shù)量為一贷痪,從數(shù)學(xué)的角度來看SingleThreadPool應(yīng)該屬于FixedThreadPool的子集幻妓。其corePoolSize=maximumPoolSize=1,且keepAliveTime為0,適合線程同步操作的場所劫拢。
示例代碼如下:

package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
 public static void main(String[] args) {
  ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
  for (int i = 0; i < 10; i++) {
   final int index = i;
   singleThreadExecutor.execute(new Runnable() {
    public void run() {
     try {
      System.out.println(index);
      Thread.sleep(2000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
   });
  }
 }
}

5.4 newScheduleThreadPool

創(chuàng)建一個(gè)定長的線程池肉津,而且支持定時(shí)的以及周期性的任務(wù)執(zhí)行,支持定時(shí)及周期性任務(wù)執(zhí)行舱沧。

Scheduled中文解釋為計(jì)劃妹沙。結(jié)合在一起解釋計(jì)劃的線程池,顧名思義既然涉及到計(jì)劃狗唉,必然會(huì)涉及到時(shí)間初烘。所以ScheduledThreadPool是一個(gè)具有定時(shí)定期執(zhí)行任務(wù)功能的線程池。

示例一:延遲3秒執(zhí)行

package test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorTest {
 public static void main(String[] args) {
  ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
  scheduledThreadPool.schedule(new Runnable() {
   public void run() {
    System.out.println("delay 3 seconds");
   }
  }, 3, TimeUnit.SECONDS);
 }
}

示例二:表示延遲1秒后每3秒執(zhí)行一次:

package test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorTest {
 public static void main(String[] args) {
  ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
  scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
   public void run() {
    System.out.println("delay 1 seconds, and excute every 3 seconds");
   }
  }, 1, 3, TimeUnit.SECONDS);
 }
}

文章引用:https://www.cnblogs.com/williamjie/p/9485723.html
更多:https://juejin.cn/post/6844903834158907399#heading-0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肾筐,隨后出現(xiàn)的幾起案子哆料,更是在濱河造成了極大的恐慌,老刑警劉巖吗铐,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件东亦,死亡現(xiàn)場離奇詭異,居然都是意外死亡唬渗,警方通過查閱死者的電腦和手機(jī)典阵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镊逝,“玉大人壮啊,你說我怎么就攤上這事〕潘猓” “怎么了歹啼?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長座菠。 經(jīng)常有香客問我狸眼,道長,這世上最難降的妖魔是什么浴滴? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任拓萌,我火速辦了婚禮,結(jié)果婚禮上升略,老公的妹妹穿的比我還像新娘微王。我一直安慰自己,他們只是感情好降宅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布骂远。 她就那樣靜靜地躺著囚霸,像睡著了一般腰根。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拓型,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天额嘿,我揣著相機(jī)與錄音,去河邊找鬼劣挫。 笑死册养,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的压固。 我是一名探鬼主播球拦,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坎炼?” 一聲冷哼從身側(cè)響起愧膀,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谣光,沒想到半個(gè)月后檩淋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萄金,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年蟀悦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氧敢。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡日戈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孙乖,到底是詐尸還是另有隱情涎拉,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布的圆,位于F島的核電站鼓拧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏越妈。R本人自食惡果不足惜季俩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梅掠。 院中可真熱鬧酌住,春花似錦、人聲如沸阎抒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽且叁。三九已至都哭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逞带,已是汗流浹背欺矫。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留展氓,地道東北人穆趴。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像遇汞,于是被迫代替她去往敵國和親未妹。 傳聞我的和親對象是個(gè)殘疾皇子簿废,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容