🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#149854
From: keef
Date: Thu, 25 Mar 2010 16:38
74 lines
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-mail
References: <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