2017-02-13 58 views
-2

我對Java很陌生,所以如果這個問題無知,我很抱歉。具有自己的線程的類是否也有其他類使用的靜態方法?

比方說,我有一個實現了Runnable的類A,該類的一個實例在main中創建並賦予它自己的線程。假設班級擁有城鎮對象的藍圖,而且這個城鎮有居民。班級鎮能夠創造新的居民。它也能夠反覆印刷當前的城鎮佈局。

這個類然後有一個反覆執行任務的運行方法(刷新城市佈局)。該類還有靜態方法,我想被其他類使用(創建新的居民)。

我現在有B班,裏面有一個居民的藍圖。因此,有很多這種類的實例在自己的線程中運行,並且想要使用類B的靜態方法來再現(即創建新的居民)。

現在假設A類和B類對象都有自己的線程在運行。如果B類(居民)的對象決定再現(使用B類靜態方法之一),這是否會導致A類對象線程中斷?

I.e.當一個居民想要複製時,再現靜態方法的行爲是否會在居民線中?

我已閱讀了Java中的多線程,但該主題對於實際實現它時很難理解。任何有關多線程的建議通常都會很有幫助。先謝謝你。

+3

唐*描述*代碼,*顯示*代碼。 –

+0

在軟件中,大多數東西都是*可能*。但請理解:使用** static **更多的是反模式。如果有的話,如果您的應用程序確實需要全局狀態,那麼您會考慮使用單例。但正如TJ所說:我們不談論代碼的描述,我們在這裏討論代碼。我們不提供設計/實施指導,我們幫助**特定的**編程問題/問題。 – GhostCat

回答

0

現在假設A類和B類對象都有它們的線程在運行。如果B類(居民)的對象決定再現(使用B類靜態方法之一),這是否會導致A類對象線程中斷?

不。在類或方法的一部分和它所運行的線程之間沒有連接。線程和方法之間的唯一關聯是當你調用方法時,它在當前正在執行的線程上運行。如果Arun正在線程4452上運行,並且您在線程4127上調用B.whatever(),那麼它對線程4452不起任何作用,除非它們都嘗試在同一個對象上進行同步。

-2

通常方法和其他代碼總是在調用者線程中執行,除非在另一個線程環境中手動重定向。

既然你講的是靜態方法,他們無論如何都不能訪問類對象,如果你改變你的靜態方法中的類行爲可能不是一個好主意,也許你不應該使用這麼多的靜態方法,除非對於某些常量值然後在大多數情況下,線程間訪問是沒有問題的。但這取決於你的代碼以及你在這些方法中做了什麼......

在Java中,如果您需要對來自多個線程的某些變量或類成員具有寫訪問權限,或者使用自定義synchronized { ... }塊或方法。

0

比方說,我有一個實現了Runnable的類A,該類的一個實例在main中創建並賦予它自己的線程。

在Java中給類創建一個線程的想法沒有意義。你給一個Thread對象一個Runnable實例,當你的線程爲start()時,它執行給定實例的run()方法。線程運行後,它如何執行給定的run()方法,以及程序的主線程如何執行程序的main(String[] args)方法沒有區別。

......當一個居民想要複製時,再現靜態方法的行爲是否會在居民線中?

只有線程是線程調用的方法的局部變量。

的對象永遠是一個線程,因爲一個對象可以永遠不會在變量:對象始終堆,和變量僅保持引用。

所以,你所描述的基本上是兩個不同的線程,每個線程執行不同的方法,並且他們都在相同的對象上操作,完全不顧對方。

這通常是一件壞事。

您需要確保線程同步它們對共享對象執行的操作以避免弄亂彼此的工作。一個很好的起點,學習是通過Java Concurrencty教程,以自己的方式工作:http://docs.oracle.com/javase/tutorial/essential/concurrency/

當你準備深究下去,這本書的「Java併發編程實踐」是一個很好的下一步:https://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/

相關問題