Java: Thread.currentThread (). Sleep (x) a Thread.sleep (x)

86

Mam to w swoim kodzie

Thread.currentThread().sleep(x);

Eclipse mówi mi, żebym użył statycznej

Thread.sleep(x); 

zamiast tego dlaczego? Jaka jest różnica, czy istnieje jakaś różnica w funkcjonalności między tymi 2 metodami?

Omu
źródło
1
w Eclipse jest `` Zapisz akcję '', która automatycznie zamieni statyczny dostęp do elementów członkowskich za pośrednictwem zmiennych instancji na statyczny dostęp za pośrednictwem nazwy klasy - włącz tę akcję zapisywania i tyle innych akcji zapisywania, z którymi się zgadzasz (np. usuń niepotrzebne rzutowania, niepotrzebne „to” itp.).
les2

Odpowiedzi:

135

Jest tylko jedna metoda, a nie dwie, i jest ona statyczna. Chociaż możesz wywołać metodę statyczną za pośrednictwem odwołania do instancji, nie jest to dobry styl. Wskazuje, że programista myśli, że wywołuje metodę instancji. Zdezorientowany programista może pomyśleć, że może spowodować, że inny wątek (nie bieżący) będzie spał w ten sposób, podczas gdy tak nie jest.

Obie linie kodu robią to samo, ale druga to lepszy styl.

Sean Owen
źródło
24
+1 do wzmianki, że programista może chcieć uśpić określony wątek przez someThread.sleep (), czego nie robi.
Chii
32

W Javie sen jest metodą statyczną. Oba twoje przykłady robią dokładnie to samo, ale poprzednia wersja jest myląca, ponieważ wygląda na to, że wywołuje metodę na określonym obiekcie, ale w ogóle tego nie robi. W twoim przykładzie nie będzie to miało większego znaczenia, ale jest bardziej niebezpieczne, jeśli masz:

someOtherThread.sleep(x);

Tym razem wygląda na to, że każesz spać inny wątek, ale w rzeczywistości uśpisz bieżący wątek. Sposobem na uniknięcie popełnienia tego typu błędu jest zawsze wywoływanie metod statycznych przy użyciu klasy, a nie określonego obiektu.

Mark Byers
źródło
Czy masz na myśli, że zarówno currentThread, jak i someOtherThread przejdą w stan uśpienia podczas wykonywania tej pojedynczej linii "someOtherThread.sleep (x);" ??
Kanagavelu Sugumar
3
Nie. Bieżący wątek przejdzie w stan uśpienia, niezależnie od wywołania obiektu Thread .sleep. Nie możesz uśpić innych ThreadS (w ten sposób).
Torque
3

Te dwa wywołania metod zachowują się identycznie, ponieważ wywołują tę samą metodę, ale użycie nazwy klasy ( w tym przypadku Thread ) zamiast wystąpienia w celu uzyskania dostępu do pól i metod statycznych sprawia, że ​​ta statyczność jest jasna. Dlatego pojawia się to ostrzeżenie.

Biorąc jednak pod uwagę, że statyczne pola i metody są wyświetlane w określony sposób w większości IDE (na przykład kursywą w Eclipse i IntelliJ IDEA), czy to ostrzeżenie jest nadal konieczne? Może nie tak bardzo potrzebne, jak we wczesnych latach Java, kiedy używano prostych edytorów.

Amir Moghimi
źródło
0

Thread.currentThread().sleep(x);lub sposób, w jaki Eclipse mówi, że Thread.sleep(x);kontekst statyczny jest wymagany, jeśli jest w potrzebie, więc wstrzymujemy się z niewielkim opóźnieniem w tym śnie.

Paradygmat statyczny ustawiony przez jeden obiekt, wpływa tylko na ten konkretny cykl życia sterty obiektu, ponownie biorąc pod uwagę, że ogólny statyczny cykl życia obiektu nie jest tak uciążliwy, w razie potrzeby można go użyć do ułatwienia kodowania, ale należy go wykonać ostrożnie jako statyczny stop- print jest określany przez Class(na przykład: - Class.forName(pkg.className)) jak z nazwy, a nie przez jakąkolwiek objectkopię klasy Class w HEAPpamięci.

Ponownie użycie obiektu ma również wady i zalety w postaci słabych, fantomowych, mocnych odniesień ....,

Kod jest zagmatwany przez naturę. To po prostu sposób, w jaki robimy, aby działał i działał.

Dev Anand Sadasivam
źródło
1
Mówiąc o wątku, - pojawia się asynchronicznie, chociaż możemy mieć synchroniczne rzeczy w wątkach. Z natury rzeczy wszystkie rzeczy są asynchroniczne, chociaż czasami znajdujemy rzeczy synchroniczne. Żadna z tych rzeczy nie jest synchroniczna, nawet jeśli ingerujemy w kwantę lub astronomię.
Dev Anand Sadasivam,