我正在運行一個方法從我的主生成數據,我也叉一個線程,監視該方法正在寫入的隊列,如果有數據將其保存到磁盤。有沒有辦法告訴程序是否仍在運行一個方法?
我的問題是在過去,我會多線程了,就能夠監視線程的生活,但我不知道該怎麼做,如果它只是主要的方法是什麼?該方法正在慢慢地生成數據,並且使用sleep或!queue.empty()只要它清空分叉文件寫入程序進程停止的隊列就不起作用。
我知道最壞的情況下,我可以寫的方法生成的數據文件,但除此之外,有什麼我可以做,如果仍然在執行另一種方法來監控?
我正在運行一個方法從我的主生成數據,我也叉一個線程,監視該方法正在寫入的隊列,如果有數據將其保存到磁盤。有沒有辦法告訴程序是否仍在運行一個方法?
我的問題是在過去,我會多線程了,就能夠監視線程的生活,但我不知道該怎麼做,如果它只是主要的方法是什麼?該方法正在慢慢地生成數據,並且使用sleep或!queue.empty()只要它清空分叉文件寫入程序進程停止的隊列就不起作用。
我知道最壞的情況下,我可以寫的方法生成的數據文件,但除此之外,有什麼我可以做,如果仍然在執行另一種方法來監控?
聽起來像一個ExecutorService
好工作。在主方法創建:
ExecutorService pool = Executors.newFixedThreadPool(10);
ExecutorService
基本上是圍繞一個隊列的包裝和一組正在等待該隊列(10例以上)線程。當下的東西出現在隊列(提交),只有一個線程將它拾起:
pool.submit(someWork);
凡someWork
是一個Runnable,即如將數據寫入磁盤並寫入程序。當你在主線程中完成的,你只需問pool
正常終止:
pool.shutdown();
pool.awaitTermination(60, TimeUnit.SECONDS);
此代碼將等待60秒,其他線程完成並處理隊列中的所有項目。
向我們展示更多代碼,我可以幫助您重構它。如果你不想走那麼遠,有些Java集合中的方法會在隊列爲空時阻塞,並在出現問題時喚醒線程。
感謝Tomasz。我知道如何做到這一點,我認爲它是一個好主意。因爲我只是運行一個線程,我沒有想到這個......感謝我給它一個鏡頭。 –
您還可以使用jstack命令打印JVM線程的堆棧跟蹤。
你在使用LinkedBlockingQueue嗎?這將阻止調用者,直到已將某些內容添加到隊列中,以便在隊列爲空時文件寫入器不會停止。你可以使用'LinkedBockingQueue'並排隊一些特殊的對象來表明你的進程已經完成向隊列中添加數據。 –
你說'fork'是一個線程,這是沒有道理的,真的:你在fork一個新的_process_或Thread.start()''新線程嗎?這在相關的答案中產生了巨大的差異... – Matt
@ MattCrinklaw-Vogt intresting,不知道。我使用的是ArrayBlockingQueue,但我可以給LinkedBlockingQueue一個鏡頭。 –