Article View: pl.comp.lang.java
Article #149854Re: czy wątki mogą świadczyć usługi?
From: keef
Date: Thu, 25 Mar 2010 16:38
Date: Thu, 25 Mar 2010 16:38
74 lines
3815 bytes
3815 bytes
W dniu 2010-03-21 18:07, nullpointer pisze:
> W dniu 2010-03-21 17:29, andrzej salwicki pisze:
>> Czy można w efektywny sposób zaprogramować wątek A tak by pełnił swoje
>> zadanie i równocześnie był gotów świadczyc usługi? Dokładniej, czy
>> inne wątki: B, C, ... mogą wywoływać metody publiczne, synchronized
>> wątku A, powodując chwilowe przerwanie akcji wątku A,[ciach]
>
> Obawiam się, że mylisz wątek z obiektem.
> Wątek B może wykonać metodę x() na rzecz obiektu A (który może, ale nie
> musi być instancją klasy pochodnej po Thread), ale to wywołanie wykona
> się w wątku B, a nie A.
>
> Jeśli chcesz aby wątek B "zlecał" zadania do wykonania wątkowi A, to
> proponuję zainteresować się interfejsem BlokingQueue i implementującymi
> go klasami, albo kolejkami w ogóle. No i wzorcami takimi jak Producer i
> Consumer.
>
Ja tutaj muszę się zgodzić.
Najważniejszy w Javie (przynajmniej dla mnie) jest interfejs. On określa
CO będzie zrobione (np. informuje, że może coś posortować). Natomiast
nie mówi JAK - to robi klasa - dostarcza implementację.
Weźmy przykład:
public interface Sorter{
public void sort() throws SorterException;
}
Gdzie tu jest napisane JAK elementy są sortowane? Nigdzie. Weźmy
implementacje (przykładowe dwie)
public class ThreadedSorter implements Sorter{
public void sort() throws SorterException{
//tworzy wątek i sortuje elementy w osobnym wątku;
}
oraz
public class SimpledSorter implements Sorter{
public void sort() throws SorterException{
//sortuje elementy w obecnym wątku
}
Z interfejsu (jeśli oczywiście nie jest to napisane explicite), nie
wynika JAK trzeba coś zrobić.
Teraz pytanie:
Jeśli wątek jest 'pracownikiem', który może zostać całkowicie ukryty -
klasa używająca obiektu nawet nie musi wiedzieć, że za interfejsem chowa
się wątek - to czy dobrze jest go 'łączyć' na stałe z klasą, w taki
sposób, aby WSZYSCY widzieli, że tam jest osobny wątek?
O co mi chodzi?
Dlaczego pisać "extends Thread" lub nawet (w publicznej klasie)
"implements Runnable", kiedy jest to szczegół implementacyjny, o którym
klienci mogą nie wiedzieć?
Oczywiście można się kłócić (nawet trzeba :-) ).
Na poparcie moich wypocin, mogę przedstawić interfejs(y):
1. Executor (i ExecutorService), których zadaniem jest ukrywanie wątków
2. Interfejs Runnable, który powinien być używany ZAMIAST dziedziczenia
po klasie Thread (próba rozdzielenia implementacji od specyfikacji)
I teraz dochodzimy do zasadniczej kwestii. Jak wydzielić interfejs,
który przedstawia postawiony problem w sposób niezależny od wątków? Da
się? A jak się nie da, to pytanie brzmi dlaczego? Być może problem leży
w koncepcji...
Pozdrawiam
keef
Technical Details
Message-ID:
<hog3hh$s2g$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-mailReferences:
<4c3b4f20-3f62-4e54-9e3c-298e4ea6c3e5@g10g2000yqh.googlegroups.com> <ho5jpd$gir$1@news.onet.pl>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: Thu, 25 Mar 2010 17:38:10 +0100 Organization: CI TASK http://www.task.gda.pl/ Lines: 74 Message-ID: <hog3hh$s2g$1@news.task.gda.pl> References: <4c3b4f20-3f62-4e54-9e3c-298e4ea6c3e5@g10g2000yqh.googlegroups.com> <ho5jpd$gir$1@news.onet.pl> NNTP-Posting-Host: 90-156-6-120.as.kn.pl Mime-Version: 1.0 X-Trace: news.task.gda.pl 1269535089 28752 90.156.6.120 (25 Mar 2010 16:38:09 GMT) X-Complaints-To: abuse@news.task.gda.pl NNTP-Posting-Date: Thu, 25 Mar 2010 16:38:09 +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: <ho5jpd$gir$1@news.onet.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit