Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Peredacha globalnyh peremennyh thredam


Автор: Gost' 10.5.2004, 18:31
Privet, ALL!

public class Server extends Thread {
int i=0;
...............

public static void main (String[] args) throws IOException {
try
{
ServerSocket Server = new ServerSocket(port);
while(true)
{
Server Ser = new Server(Server.accept());
Ser.start();

}
} catch(Exception e) {System.out.println("init error: "+e);}
}
...............

public Server (Socket NewClient) {
this.NewClient = NewClient;
}

public void run () {
//zdes nado izmeniat peremennuju i, tak chtoby ona izmenilas dlia vseh novyh threadov
}

Zaranee blagodaren za liubuju pomosh.

Автор: sergejzr 10.5.2004, 19:09
Попробуй вместо:
Код

int i=0;

вот это:
Код

static int i=0;


А вообще лучше определи функции set и get вот ссылка:
http://forum.vingrad.ru/index.php?showtopic=21752

PS: пожалуйста, пользуйся http://www.translit.ru

Автор: Gost' 10.5.2004, 21:21
Спасибо за помощь, Сергей.smile.gif

Автор: Domestic Cat 10.5.2004, 21:49
Anyway you should remember that this (class) variable will not be thread-safe
(and instance variables as well). Therefore you should think about synchronization - sure, if is not just simple counter or something.

Автор: LSD 10.5.2004, 22:08
2 Domestic Cat
Самим по себе примитивным типам синхронизация не нужна. Она нужна если у него есть другие поля которые нужно менять синхронно с i (например массив содержащий ссылки на экземпляры класса). Тогда действительно синхронизация нужна. А если i это только счетчик, то его можно и не синхронизировать.

Автор: Domestic Cat 11.5.2004, 00:03
Цитата
Самим по себе примитивным типам синхронизация не нужна. Она нужна если у него есть другие поля которые нужно менять синхронно с i (например массив содержащий ссылки на экземпляры класса). Тогда действительно синхронизация нужна.


Ooops. Sorry? I dont talk about primitives, I talk about synchronization in general (on class, method or block).

Anything which is to be accessed by multiple threads, excluding LOCAL variables and REQUEST parameters (J2EE) must be accessed via synchronized methods or blocks unless you are completely sure that there will be NO side-effects. There are NO atomic operations in Java. Consider situation: thread A invokes method saveVariable() which just writes static field i:
1. A tries to write variable i.
2. While it is writing it, it is in UNSTABLE state.
3. Thread B invokes the same method and tries to read i, but it is in unstable state.
This situation is quite exotic, however suppose that thread tries to do something with i.
Say, thread A invokes method myMethod which does the following:
1. reads i
2. does some calculations
3. writes i.
If thread B invokes the same method (and it is not synchronized, i.e. not thread-safe) it is impossible to know what time slicing will be done by scheduler, and you dont know what will happen. Thread B may perform step 1 when thread A ALREADY saved i, or just BEFORE that.
Therefore you dont know what will be the result of method invocation.

Surely if i is just a thread counter and every thread just increments it by unity, no synchronization is needed. But look here:
Код

public void run () {
//zdes nado izmeniat peremennuju i, [b]tak chtoby ona izmenilas dlia vseh novyh threadov[/b]
}

Probably, threads are supposed to do something with i - it is not clear. Say, thread 12 changes i, and thread 13 must have known that but it has already read i BEFORE 12 changed it. It would be error. This leads to that you need to access i through mutator method which is synchronized on something (any object, say arbitrary wrapper declared in this class).
All other threads will wait till current thread will release the lock on this object and thus i
will be thread-safe variable. Usually it is better to synchronize block of code rather than method or class.
Anyways, it depends on authors implementation and what actually he does with i.

Автор: Gost 11.5.2004, 11:42
In this case I only need to increase i in the begining of the thread and decrease it in the end of the same thread. So I doubt having any problems with accessing this i from different threads. The role of i is a number of clients connected at the moment.

Автор: Domestic Cat 11.5.2004, 15:11
Then much elegant solution would be to use http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ThreadGroup.html (activeCount()) rather than to save this number in static variable.

Автор: ElectricalStorm 11.5.2004, 19:20
сори за офф
Вот ё куда я попал .... а по русски можно ?

Автор: Domestic Cat 11.5.2004, 20:14
Sorry za English, but i have no russificator, no keyboard with russian letters and its takes a lot of time to use translit.ru ;->

Автор: ElectricalStorm 11.5.2004, 20:18
tak pishite translitom smile.gif

Автор: Gost' 11.5.2004, 23:48
Возможно и удобнее, просто я новичок в JAVA, о таких вещах ещё не слышал. Но переменная static меня вполне устраивает на данном этапе.

Автор: sergejzr 12.5.2004, 00:12
Цитата
Gost'
Возможно и удобнее, просто я новичок в JAVA, о таких вещах ещё не слышал. Но переменная static меня вполне устраивает на данном этапе.
Для твоей задачи её вполне достаточно.
Мои советы тебе, как новичку:

  • Попытайся с первых программ присвоить себе Явский стиль программирования. Вместо глобальных переменных например используй класс со статическими функциями. Очень пригодится, если надо будет расширить программу. Например проверкой на максимально возможное число коннектов.
  • Зарегестрируйся - больше ответов будет на вопросы.


__________________________________________________________
PS:
Цитата
Domestic Cat
Sorry za English, but i have no russificator, no keyboard with russian letters and its takes a lot of time to use translit.ru ;->
Из за пары строк? Абсолютно все мои посты на этом форуме например написаны с помощью translit.ru . В первую очередь заботимся о читающем, а потом о себе. Может звучит несколько грубо, просто достали уже эти Ин-Язы. Неверно исходить из того, что все должны понимать по английский.
Цитата
ElectricalStorm
tak pishite translitom

И нажимайте на ссылку Translit -> Russian!

2Gost'
Спасибо за то, что воспользовался translit.ru, и мои глаза отдыхают читая твои посты.

Автор: Domestic Cat 12.5.2004, 01:12
Vse-taki interesno, a na kakom yazike vy chitaete dokumentatsiyu, specifikacii etc ?
Programmist ne znayushii angliiskogo?

Nu eto ya tak, iz merzkosti haraktera wink.gif

Автор: sergejzr 12.5.2004, 01:32
Если мы так и будем продолжать - наши внуки ещё будут читать доку "по-американски" sad.gif
/OFFTOP
Не разу не читал документации на транслите. thumbs-up.gif
Я живу в Германии учусь на английском курсе, но не теряю надежды не разучить Великий и Могучий.
/OFFTOP

Автор: Domestic Cat 12.5.2004, 01:35
Цитата
Попытайся с первых программ присвоить себе Явский стиль программирования. Вместо глобальных переменных например используй класс со статическими функциями. Очень пригодится, если надо будет расширить программу. Например проверкой на максимально возможное число коннектов.


1. Termin "globalnaya peremennaya" - eto iz c++, v Java globalnih peremennih net i byt ne mozhet (esli ne verite - http://mindprod.com/jgloss/globalvariable.html).
Termin functsiya - opyat' taki ne iz Java. Metod nikak funktciey nazvat nelzya. Metod - eto sposob communikatsii objectov classa. Bolshe nichego v Java net.

2. Stil' Java - eto REUSE (pereispolzovanie, no tochnogo russkogo termina ya ne znayu). V classe ThreadGroup est method activeCount() - zachem velosiped izobretat? Kogda vy zapuskaete novii thread, sootvetstvuyushee pole classa izmenyaetsa. Vvodya static pole vy delaete tu zhe rabotu snova.

3. Nakonets, vvodit otdelnii class dlya static metodov - eto uzh tochno ne Java. Nuzhno dumat o classe kak o "fabrike objectov", a ne meste gde metody hranyatsa. Esli vy proizvodite neskolko objectov classa A, to static metody dolzhny byt obshimi dlya objectov otogo classa.
V dannom sluchae kolichestvo aktivnyh Srever'ov skoree dolzhno byt opredeleno v classe Server, a ne drugom classe. Eto nazyvaetsa ENCAPSULATION. Kak raz eto i est horosho pri dalneyshem processe.

Автор: sergejzr 12.5.2004, 01:52
/OFFTOP Раз уж решил разбирать мой пост по косточкам, придётся ответить так же... /OFFTOP

Теперь расскажи это всё человеку, который только начинает программировать (на Яве). Потом спроси у него чего он из этого понял.
Читай внимательно там написано "вместо глобльных переменных". Я пытаюсь обьясняться с человеком на "его" языке (с функцией тоже самое).
И вообще читай вопрос! Где там стоит "как оптимально сосчитать количество запущеных потоков?". А про работу с глобальными вещами вообще - стоит обьяснить.
___________________________________________________________
PS:
Всё пошёл Флейм!
Я больше не буду писать подобных ответов. Если хочется дискутировать дальше по поводу определений и терминов, пожалуйста создай тему во флейме...

Автор: Domestic Cat 12.5.2004, 02:12
Esli eto fleim, to forumi Sun Microsystems sostoyat iz nego na 90%. Vse taki ya pishu o Java, a ne o ptitsah.

Teper o cheloveke nachinayushem programmirovat. Etot chelovek kogda-to da dolzhen uznat o tom chto takoe metod, static pole, itp. No esli on etogo ne znaet, vdvoine huzhe govorit emu o Java v terminah C++.

PS. Po-povodu dokumentatsii: vse taki Java pishetsa firmoi Sun, kotoraya nahoditsa v amerike, a ne v Rossii. A raz tak, to i poslednyaya dokumentatsiya/specifikatsiya vsegda budet snachala po-angliiski. Samie novie/horoshie knigi budut tozhe po-angliiski napisani.

Автор: Stvan 12.5.2004, 08:09
А где хранить переменную, если она используется в программе в разных местах, причем во многих ?

Автор: AntonSaburov 12.5.2004, 12:54
Цитата
А где хранить переменную, если она используется в программе в разных местах, причем во многих ?

1. Можно описать ее как статическую внутри какого-то класса и использовать.

2. Есть вариант использовать шаблон Singletone (предназначен для того, чтобы в системе был один экземпляр класса) - и такой объект будучи "одиноким странником" smile.gif может быть использован как хранилище глобальных переменных.

Автор: Domestic Cat 12.5.2004, 15:46
Не совсем понятно, о какой переменнои идет речь. Опять таки, "просто" переменних в Java нет, ест class variables и instance variables. Ето в C можно говорить о переменнои самои по себе, в Java есть обekты, а переменная - ето одна из характеристиk об'ekта. Отделнии класс для етого не нужен, тем более не надо исползовать Singleton pattern. Когда я пишу Lock Manager для базы данних, мне надо точно знат что такоы обekт может быт тол'ко один. Тогда я пишу его как Singleton; если kлиент пытаетса сделать 2 LockManager'a, конструkтор бросит Exception.

Если хотите иметь константу - обявите ее public final static. Доступ к неи будет через MyClass.MY_CONSTANT. Static variable характеризует kласс как елое. Доступ к не может быт MyClass.myStaticVariable если она public. Вообше же лучсе написат getter / setter методы. Для static переменноы луче чтобы они были public static а переменная private. Для instance переменных ети методы static быт не должны, зато переменная должна быть private (ето не требование, но обычно все instance variables - private)

PS. Uzh luchse pisat' na translite

Автор: Stvan 13.5.2004, 05:27
2DomesticCat
Любишь ты углубляться в терминологию smile.gif
Чем вот это:
Цитата
Если хотите иметь константу - обявите ее public final static. Доступ к неи будет через MyClass.MY_CONSTANT. Static variable характеризует kласс как елое. Доступ к не может быт MyClass.myStaticVariable если она public. Вообше же лучсе написат getter / setter методы. Для static переменноы луче чтобы они были public static а переменная private. Для instance переменных ети методы static быт не должны, зато переменная должна быть private (ето не требование, но обычно все instance variables - private)

отличается от этого:
Цитата
1. Можно описать ее как статическую внутри какого-то класса и использовать.


О терминологии можно спорить долго, в яве действительно нет глобальных переменных, но есть способы их использовать smile.gif

Автор: Domestic Cat 13.5.2004, 15:26
Цитата
Чем вот это: ..... отличается от этого:


Ya sobstvenno otvechal na vopros

Цитата
А где хранить переменную, если она используется в программе в разных местах, причем во многих ?




Автор: Stvan 14.5.2004, 03:08
Спасибо за подробный ответ.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)