🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.java
Article #149860

Re: czy wątki mogą świadczyć usługi?

#149860
From: keef
Date: Fri, 26 Mar 2010 23:10
103 lines
5961 bytes
W dniu 2010-03-26 22:47, Maciej Sobczak pisze:
> On 26 Mar, 17:34, keef<a...@a.com>  wrote:
>
>>>>> Runnable nie powstał tylko po to, stosuje się go w wielu wielu wielu
>>>>> miejscach
>
>>>> Po co takie sztuczki ?
>
>>> znakomity przykład użycia masz właśnie w klasie Thread.
>
>> Bomba! Czy jeszcze jakiś inny pomysł na użycie poza Thread?
>
> Np. javax.swing.SwingUtilities.invokeLater(...)
>
> Nie czepiaj się Runnable. To wyłącznie efekt konstrukcji języka, który
> nie oferuje innych mechanizmów.
> Runnable sam w sobie nie ma nic wspólnego z wątkami, więc jego użycie
> w definicji klasy nie sugeruje wielowątkowości. To jest jedynie
> znacznik: "uwaga, instancje tej klasy można wywołać", gdzie
> "wywołanie" to właśnie run(). Kontekstów na użycie czegoś takiego jest
> wiele.

Podobnie jak Serializable - również jest interfejsem znacznikowym.

Poza tym przeczytaj dokładnie o co chodzi - wyciąłeś ten tekst więc 
pozwól, że go wstawię:

<ciach>
(...)opakować metodę w obiekt, żeby można ją było przekazać jako parametr.
</ciach>

Nie czepiam się interfejsu Runnable. Pytam się, dlaczego ktoś używa tego 
samego rozwiązania we własnym kodzie? Ponieważ uważam, że jakkolwiek 
pasuje do wątków, to inne jego zastosowania są wątpliwe (w sensie - da 
się to zrobić lepiej - być może będzie wolniejsze/używać więcej pamięci 
- ale rozwiązanie będzie bardziej przejrzyste).

Czy nie lepiej jest użyć wzorca projektowego 'Komenda', który robi 
bardzo podobną rzecz, ale bez wiązania jej z wątkami? Równie dobrym 
wyjściem jest Callable<T>. Oba nie wymagają rzutowania, w 
przeciwieństwie od Runnable ;-)

>
> Inne języki radzą sobie z tym problemem inaczej. Np. w C++ masz
> przeciążalny operator wywołania funkcji - bardzo zgrabna konstrukcja,
> bo składniowo unifikuje się z normalnymi funkcjami. I podobnie - można
> to użyć do wątków, ale nie trzeba.
> W Pythonie jest podobnie, ale w kontekście dynamicznym.
> W Adzie można by było użyć generyków z dowolnym przemapowaniem
> operacji w momencie jego konkretyzowania - czyli nie dość, że nie
> trzeba używać interfejsu, to nawet nazwa operacji nie musi być
> ustalona. Itd.
> Ogólnie - istnienie Runnable wynika z konstrukcji Javy, więc on sam
> niczemu nie jest winien.
> Po prostu język taki jak Java musi mieć interfejs taki jak Runnable.
>
Zgadza się. I teraz dyskutujemy jak go używać :-)

Pomimo tego, że możliwe jest, jak ktoś zaproponował, dziedziczenie po 
Thread, lub pisanie explicite "public interface MyFancyBussinesLogic 
extends Runnable", pytanie brzmi "po co tak robić?". Czy rzeczywiście 
klienci interfejsu MyFancyBussinesLogic muszą wiedzieć o wątkowości? A 
nawet jeśli, to dlaczego rozszerzać interfejs? Czy nie lepiej ukryć 
wątków wewnątrz implementacji?

Jeśli weźmiesz mój przykład z "private static class ThreadedAaa". 
Pominąłem tam oczywiście metody, które powodują, iż obiekty działają w 
osobnym wątku - skupiłem się na pokazaniu, iż "MyFancyBussinesLogic" nie 
musi "extends Runnable" i również można używać wątków :-)

>> Czy
>> widzisz jeszcze inne zastosowanie interfejsu Runnable, którego nie
>> sposób rozwiązać przy użyciu polimorfizmu?
>
> Interfejs Runnable (jak i każdy inny) opiera się na użyciu
> polimorfizmu, więc pytanie jest dziwne.
>

Nie. Sam napisałeś - znacznik. Więc Runnable, Serializable opierają się 
na polimorfizmie bardzo słabo...

Dość powiedzieć - dziedziczenie klasy, która jest 'Serializable' jest 
trudne. Musisz pamiętać, aby wszystkie klasy były odpowiednie - nie 
zawierały (agregowały) obiektów, które nie są Serializable.

Podobnie 'Runnable' - łącząc interfejs Runnable z Twoją logiką 
(interface MyFancyBussinesLogic extends Runnable) łączysz wątkowość _na 
zawsze_ z Twoją logiką - z każdą implementacją. I z każdą klasą potomną 
musisz pamiętać, że kod działa w wątku. Warto? Z drugiej strony możesz 
zdefiniować interfejs (MyFancyBussinesLogic) i dostarczyć jego 
implementację, która działa w wielu wątkach 
(ThreadedMyFancyBussinesLogic) i nie narzuca klasom dziedziczącym 
konieczności pamiętania o bezpieczeństwie wątkowym, zwalnianiu puli 
wątków, etc.

A dlaczego uważasz, że implementacja jednowątkowa jest zła tak bardzo, 
że z gruntu wykluczasz, iż będzie działać (extends Thread zmusza Cię do 
zapewnienia możliwości uruchomienia w osobnym wątku)? :P

Mam nadzieję, że przedstawiłem swój punkt widzenia :-)

Pozdrawiam.
keef
Technical Details
Message-ID: <hojess$5ct$1@news.task.gda.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.task.gda.pl!not-for-mail
References: <4c3b4f20-3f62-4e54-9e3c-298e4ea6c3e5@g10g2000yqh.googlegroups.com> <ho5jpd$gir$1@news.onet.pl> <hog3hh$s2g$1@news.task.gda.pl> <343ca24e-feae-4bf0-ba6c-ea59a4884c35@x12g2000yqx.googlegroups.com> <hoigb3$lrn$1@news.task.gda.pl> <hoiitj$c8i$1@news.onet.pl> <hoinn7$61u$1@news.task.gda.pl> <a0c376f6-f4ed-42ac-a8f8-fa6f2081e22c@j21g2000yqh.googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.task.gda.pl!not-for-mail
From: keef <a@a.com>
Newsgroups: pl.comp.lang.java
Subject: Re: czy
 wątki mogą świadczyć usługi?
Date: Sat, 27 Mar 2010 00:10:21 +0100
Organization: CI TASK http://www.task.gda.pl/
Lines: 103
Message-ID: <hojess$5ct$1@news.task.gda.pl>
References: <4c3b4f20-3f62-4e54-9e3c-298e4ea6c3e5@g10g2000yqh.googlegroups.com>  <ho5jpd$gir$1@news.onet.pl> <hog3hh$s2g$1@news.task.gda.pl>  <343ca24e-feae-4bf0-ba6c-ea59a4884c35@x12g2000yqx.googlegroups.com>  <hoigb3$lrn$1@news.task.gda.pl> <hoiitj$c8i$1@news.onet.pl>  <hoinn7$61u$1@news.task.gda.pl> <a0c376f6-f4ed-42ac-a8f8-fa6f2081e22c@j21g2000yqh.googlegroups.com>
NNTP-Posting-Host: 90-156-6-120.as.kn.pl
Mime-Version: 1.0
X-Trace: news.task.gda.pl 1269645020 5533 90.156.6.120 (26 Mar 2010 23:10:20 GMT)
X-Complaints-To: abuse@news.task.gda.pl
NNTP-Posting-Date: Fri, 26 Mar 2010 23:10:20 +0000 (UTC)
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.1.8) Gecko/20100227 Thunderbird/3.0.3
In-Reply-To: <a0c376f6-f4ed-42ac-a8f8-fa6f2081e22c@j21g2000yqh.googlegroups.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit