Sandric
Wimdows SUX
Участник
Offline
Пол:
I hate myself and I wanna die
|
|
« : 05-12-2007 20:29 » |
|
Привет, у меня бока с синхронизацыей 2 - потоков, которые рисуют летящую птичку( в которую юзверь палит базукой). 1 поток - крылья вверх, 2 - вниз. Но что б вас не нагружать, просто обьясните, почему потоки выводять свои имена не по порядку. Синхронайзед в Ява это ж как критикал секшн в Си, или других языках7. Ведь если 1 поток зашел в синхрон. блок, то 2 ждёт, и получает квант времени от проца буит вызыватся после 1 так как приоритет больше, а у меня получается, что 1 может вызыватся 2 раза подряд, или 3, кароче никакой последовательности. Если знаете, то скажите, как без thread.sleep() сделать так шоб 2 "всегда" ишол после 1, и никак иначе. import java.applet.*; import java.awt.*; import java.awt.event.*; import java.io.*; import javax.imageio.*;
public class my_game extends Applet { myThread myT;// сюда буим пихать перед загрузкой отрисовки поток String s_name; Image img_baz; int baz_h = 100; int baz_w = 50; int baz_x = 125; public void init() { this.setSize(500, 500); this.setBackground(new Color(81,185,89)); try { img_baz = ImageIO.read(new File("Bazoooka.jpg")); } catch (IOException e) { System.out.println("Error!"); } myThread myt1 = new myThread(this,"ptichka1.jpg", "1"); myThread myt2 = new myThread(this,"ptichka2.jpg", "2"); myt1.start(); myt2.start(); addKeyListener(new myKeyAdapter(this));
}
synchronized public void getP(myThread myTparent){// а вот и виновник... myT = myTparent;//пихаим поток в наш екз. для данных по отрисовке System.out.println(myT.name); s_name = myT.name; repaint();// отрисовка } public void paint(Graphics g) { g.drawImage(img_baz, baz_x, this.getHeight() - baz_h, baz_w ,baz_h , null); g.drawImage(myT.t_img, myT.t_img_x,0, myT.t_img_w ,myT.t_img_h , null);// отрисовка } }
class myKeyAdapter extends KeyAdapter { my_game applet; public myKeyAdapter(my_game applet_parent){ this.applet = applet_parent; } public void keyPressed(KeyEvent ke) { if(ke.getKeyCode() == 39) {this.applet.baz_x+=10; this.applet.repaint();} if(ke.getKeyCode() == 37) {this.applet.baz_x-=10; this.applet.repaint();} } }
class myThread extends Thread{ my_game applet; Image t_img; String name; int t_img_h = 50; int t_img_w = 50; int t_img_x = 0; int t_speed = 5;
public myThread(my_game appletparent, String path, String nameparent){ name = nameparent; applet = appletparent; try{ t_img = ImageIO.read(new File(path)); }catch(IOException e){System.out.println("Erooor!");} } public void run(){ for(int i = 0; i<50; i++){ this.t_img_x +=t_speed;
this.applet.s_name = this.name; this.applet.getP(this);// вызов синхр. функции //try{ // this.sleep(1000); //}catch(InterruptedException e){System.out.println("jjj");} } } }
а вот шо мне видаёт еклипс: 1111111111112222222222222222222222222222222222222222222222222211111111111111111111111111111111111111
|
|
« Последнее редактирование: 05-12-2007 20:37 от Sandric »
|
Записан
|
We hate love, we love hate...
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 05-12-2007 21:24 » |
|
Никак. Как винда запускает потоки, это политика самой винды. Из пользовательского приложения практически никак нельзя влиять на этот процесс. Только досрочно завершать выполнение потока при помоши sleep. В Java точно не знаю. Но в WinAPI sleep с параметром 0 завершает поток и если нет потоков с таким же приоритетом в очереди потоков, винда может повторно запустить поток. Кстати, а зачем такое изврашение, что один поток "поднимает", а второй "опускает" крылья у бедной птици? Чем тебе не подходит обычный таймер?
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Sandric
Wimdows SUX
Участник
Offline
Пол:
I hate myself and I wanna die
|
|
« Ответ #2 : 05-12-2007 21:35 » |
|
Задание такое. А слип етот не из апи, а встроеный метод класса поток у самой явы. Тю, блин, шота я тада ваще не врубаюсь, как это "винда сама решаит", я когдато мютексы делал всё там по очереди ишло. А без слипа нада сделать тошо по моему ето бред, полагатся тока на примерную, на глаз оценку задержки цп. У явы есь такая штука как wait notity notifyall функции, и с ними мона ожидать, например вып. пока не выполницца което условие, для етого я там даже поле посавил в прогу p_name шоб сверять имя пред потока с тепер, и выполнять тока по наступленни события для разблокировки, от тока оно у меня не пашит, и выводит про коета переполнение( видно вайла в getP ). Ну хоть как-та можна ж его организовать! Ато у меня не мархант а койта чернобыльский курятник палучаицца!
|
|
|
Записан
|
We hate love, we love hate...
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #3 : 05-12-2007 21:52 » |
|
Sandric, Пиши чуть чуть более грамотно. У меня по русскому тоже были двойки. Но для этого сушествует тезарус, хотя бы в том же ворде.
Я специфику Java не знаю и код честно говоря не смотрел, поэтому буду говорить на примере WinAPI. Смотри, есть функция в WinAPI, которая ожидает какой либо событие. При этом thread исключается из очереди на выполнение. Еше такая деталь. Хоть и Windows, *nix и мультизадачные среды, но нужно понимать, что на однопроцессорной платформе это все равно псевдо мультизадачность. В данный конкретный момент времени работает только один поток. Он отрабатывает свой квант времени, система переключает процессор на другой поток. Просто эта смена случается довольно часто, поэтому в человеческом измерении мы не видим разници между псевдо и настояшей мультизадачностью. Исходя из этого и твоего обьяснения проблемы, хорошо, ты освободил секцию, и тут же ее пытаешся захватить. Но второй поток то не работает в это время. Он просто физически не может захватить секцию. Так он и будет висеть, пока ему не повезет. Не надейся на то, как будут работать и запускаться потоки. На это ты не можеш влиять.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Sandric
Wimdows SUX
Участник
Offline
Пол:
I hate myself and I wanna die
|
|
« Ответ #4 : 05-12-2007 22:11 » |
|
Sandric, Пиши чуть чуть более грамотно. У меня по русскому тоже были двойки. Я постараюсь, просто у меня и русского никогда не било, это не мой родной язик, но я постараюсь. Не надейся на то, как будут работать и запускаться потоки. На это ты не можеш влиять. Пасибо, не очень обнадёживающе... Теперь нужно както сообщить об этом моему преподу...
|
|
|
Записан
|
We hate love, we love hate...
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #5 : 05-12-2007 22:27 » |
|
Можно сделать ход конем . Создать 2 критичиские секции. Первую секцию использовать как обычно, а вторую как сигнал, что второй поток еше не отработал.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 06-12-2007 05:23 » |
|
Sandric, с крисеками в двух потоках не справишься, нужен мутекс или события. А ещё лучше могу предложит вариант : Финч упоминал про таймер. Если тебе обязательно нужно 2 потока - сделай один поток таймером (без использования сообщения WM_TIMER) (опять же , всё гоню под с++ - просто мысль выдаю) Один поток (таймер) делает такую штуку pars_for_timer { DWORD dwdTimer1; DWORD dwdTimer1; DWORD bExit1; DWORD bExit2; };
timer_thread(void* pars) { pars_for_timer* P1= (pars_for_timer*)pars; //глобальные параметры - счётчики таймеров for(;!P1->bExit1;) { Sleep(50); //инкремент/декремент счётчиков InterlockedIncrement(P1->dwdTimer1); InterlockedIncrement(P1->dwdTimer2); } return 0; };
а второй поток ТОЛЬКО ЧИТАЕТ параметры movie_thread(void* pars) { const pars_for_timer* P2= (const pars_for_timer*)pars;
for(;!P2->bExit2;) { } return 0; }
для завершения потоков надо сделать InterlockedIncrement(PAR->bExit1); InterlockedIncrement(PAR->bExit2); Sleep(2000); //сколько то ждём , чтоб завершились потоки
для контроля завершённости потоков - можно в конце потока, перед return 0, вновь отнять от ExitN - и дождаться нулей (там, где сейчас Sleep(2000) )
|
|
« Последнее редактирование: 06-12-2007 05:26 от Алексей1153++ »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #7 : 06-12-2007 07:23 » |
|
Алексей1153++, это все таки Java - забудь про Win32 API - здесь свое, совершенно независимое от ОС. Общее у них только то, что виртуальная машина, все-таки, работает в ОС и зависит от ее повадок.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 06-12-2007 08:32 » |
|
понятно. Говорю же - только идею толкнул
|
|
|
Записан
|
|
|
|
Sandric
Wimdows SUX
Участник
Offline
Пол:
I hate myself and I wanna die
|
|
« Ответ #9 : 06-12-2007 15:25 » |
|
Пасибо всем за ответы, Finch Создать 2 критичиские секции. Первую секцию использовать как обычно, а вторую как сигнал, что второй поток еше не отработал. Мой мозг вобше отказ. понимать такое, но если би оно и пахало, то было би сильно закрученно, и препод би подумал что то не я писал лабу. 2 Алексей1153++. Спасибо за помощь, но я сам знаю что такое мютексы, но, кстати не понимаю, почему нильзя для 2 потоков использовать критикал секшнс, они ж у меня с 1 процесса. Всё дело в том, что ява работаит с виртуальной машиной, а не с апи, и организованы спец функции для того что б не терять мультиплатформенность. Я глубоко забил и тупо поставил слип на 100 мсек., и всё идёт нормально. След. лаба - сделать компонент ява бинс, так шо не пропадайте, если будет что-то не понятно, будет часть 3
|
|
|
Записан
|
We hate love, we love hate...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 06-12-2007 16:59 » |
|
но, кстати не понимаю, почему нильзя для 2 потоков использовать критикал секшнс, они ж у меня с 1 процесса. Всё дело в том, что ява работаит
из МСДН: An object of class CCriticalSection represents a "critical section" — a synchronization object that allows one thread at a time to access a resource or section of code. Critical sections are useful when only one thread at a time can be allowed to modify data or some other controlled resource. For example, adding nodes to a linked list is a process that should only be allowed by one thread at a time. By using a CCriticalSection object to control the linked list, only one thread at a time can gain access to the list.
возможно для явы это и не катит, не спорю ) хммм, это же мфс-ишный класс , а поглядел для апишного объекта - Critical section objects provide synchronization similar to that provided by mutex objects, except that critical section objects can be used only by the threads of a single process.
почему разницо ?
|
|
« Последнее редактирование: 06-12-2007 17:08 от Алексей1153++ »
|
Записан
|
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 06-12-2007 19:35 » |
|
Offtopic: ой, какой дизайн тормозной... ну это про яву, а не ответ на вопрос про разницу работы крисеков в классе МФС и ядре ) Да вообще, я оффтоп развёл тут ))
Поставлю в угол.
|
|
|
Записан
|
|
|
|
Sandric
Wimdows SUX
Участник
Offline
Пол:
I hate myself and I wanna die
|
|
« Ответ #13 : 07-12-2007 12:31 » |
|
Вау, [CENSORED] классный сайт, всем советую, у меня в майнфилде в полоске главных сайтов! Пасибо!
|
|
|
Записан
|
We hate love, we love hate...
|
|
|
Sandric
Wimdows SUX
Участник
Offline
Пол:
I hate myself and I wanna die
|
|
« Ответ #14 : 07-12-2007 17:03 » |
|
Люди, если я пойму почему не пашит это, наверно сделаю лабу! F1! import java.applet.*; import java.awt.*; import java.awt.event.*; import java.io.*; import javax.imageio.*;
public class mainclass extends Applet { myThread myT; String s_name; Object sync; public void init() { this.setSize(500, 500); this.setBackground(new Color(81,185,89)); myThread myt1 = new myThread(this,"1"); myThread myt2 = new myThread(this,"2"); s_name = myt2.name; myt1.start(); myt2.start(); }
synchronized public void getP(myThread myTparent){ System.out.println(myTparent.name+" In da func..."); myT = myTparent; if(s_name == myT.name) try{ System.out.println(myT.name+" Begin 2 Wait..."); myT.wait(); }catch(InterruptedException e){System.out.println("jjj"); System.out.println(myT.name + " says: Menay s_name"); s_name = myT.name; System.out.println(myT.name + " says: Prosnites Vse!"); notifyAll(); System.out.println(myT.name + " Vihodit iz func"); } }
class myThread extends Thread{ mainclass applet; String name;
public myThread(mainclass appletparent, String nameparent){ name = nameparent; applet = appletparent;
} public void run(){ for(int i = 0; i<10; i++){
System.out.println(this.name+" Vhodit v func..."); this.applet.getP(this);
} } } } Вот что выдаётса: Exception in thread "Thread-4" java.lang.IllegalMonitorStateException at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:485) at mainclass.getP(mainclass.java:38) at mainclass$myThread.run(mainclass.java:79) 2 Vhodit v func... 2 In da func... 2 Begin 2 Wait... 1 Vhodit v func... 1 In da func... 1 Vhodit v func... 1 In da func... 1 Vhodit v func... 1 In da func... 1 Vhodit v func... 1 In da func... 1 Vhodit v func... 1 In da func... 1 Vhodit v func... 1 In da func... 1 Vhodit v func... 1 In da func... 1 Vhodit v func... 1 In da func... 1 Vhodit v func... 1 In da func... 1 Vhodit v func... 1 In da func... F1
|
|
« Последнее редактирование: 07-12-2007 17:06 от Sandric »
|
Записан
|
We hate love, we love hate...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 07-12-2007 18:56 » |
|
в читабельном виде (для тех, кто будет помогать ) : import java.applet.*; import java.awt.*; import java.awt.event.*; import java.io.*; import javax.imageio.*;
public class mainclass extends Applet { myThread myT; String s_name; Object sync; public void init() { this.setSize(500, 500); this.setBackground(new Color(81,185,89)); myThread myt1 = new myThread(this,"1"); myThread myt2 = new myThread(this,"2"); s_name = myt2.name; myt1.start(); myt2.start(); }
synchronized public void getP(myThread myTparent) { System.out.println(myTparent.name+" In da func..."); myT = myTparent; if(s_name == myT.name) { try { System.out.println(myT.name+" Begin 2 Wait..."); myT.wait(); } catch(InterruptedException e) { System.out.println("jjj"); System.out.println(myT.name + " says: Menay s_name"); s_name = myT.name; System.out.println(myT.name + " says: Prosnites Vse!"); notifyAll(); System.out.println(myT.name + " Vihodit iz func"); } } }
class myThread extends Thread { mainclass applet; String name;
public myThread(mainclass appletparent, String nameparent) { name = nameparent; applet = appletparent;
} public void run() { for(int i = 0; i<10; i++) {
System.out.println(this.name+" Vhodit v func..."); this.applet.getP(this);
} } } }
сам вижу только такую вещь: первый поток не заходит в блок , ибо там имя "2". второй , соответственно, заходит , и намертво повисает в блоке try: try { System.out.println(myT.name+" Begin 2 Wait..."); myT.wait();//ТУТ }
и всё , собствено ) Пока цикл 1-го не кончится
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 07-12-2007 18:57 » |
|
в блоке catch(InterruptedException e) { System.out.println("jjj"); System.out.println(myT.name + " says: Menay s_name"); s_name = myT.name; System.out.println(myT.name + " says: Prosnites Vse!"); notifyAll(); System.out.println(myT.name + " Vihodit iz func"); }
программа не бывает вообще - зачем он только ?
|
|
|
Записан
|
|
|
|
Sandric
Wimdows SUX
Участник
Offline
Пол:
I hate myself and I wanna die
|
|
« Ответ #17 : 07-12-2007 19:49 » |
|
Ой, я дико извиняюсь, не стесняйтесь, материтесь, я дужку забыл, гыгы (голосом Регины Дубовицкой...) код такой: import java.applet.*; import java.awt.*; import java.awt.event.*; import java.io.*; import javax.imageio.*;
public class mainclass extends Applet { myThread myT; String s_name; Object sync; public void init() { this.setSize(500, 500); this.setBackground(new Color(81,185,89)); myThread myt1 = new myThread(this,"1"); myThread myt2 = new myThread(this,"2"); s_name = myt2.name; myt1.start(); myt2.start(); }
synchronized public void getP(myThread myTparent){ System.out.println(myTparent.name+" In da func..."); myT = myTparent; if(s_name == myT.name) try{ System.out.println(myT.name+" Begin 2 Wait..."); myT.wait(); }catch(InterruptedException e){System.out.println("jjj");}// вот тут я и провмыкал... System.out.println(myT.name + " says: Menay s_name"); s_name = myT.name; System.out.println(myT.name + " says: Prosnites Vse!"); notifyAll(); System.out.println(myT.name + " Vihodit iz func"); }
class myThread extends Thread{ mainclass applet; String name;
public myThread(mainclass appletparent, String nameparent){ name = nameparent; applet = appletparent;
} public void run(){ for(int i = 0; i<10; i++){ /* while(this.applet.s_name == this.name) try{ System.out.println(this.name+" Begin 2 Wait..."); wait(); }catch(InterruptedException e){System.out.println("jjj"); */ //} System.out.println(this.name+" Vhodit v func..."); this.applet.getP(this); } } } }
а ответ теперь такой: 2 Vhodit v func... 2 In da func... 2 Begin 2 Wait... Exception in thread "Thread-4" java.lang.IllegalMonitorStateException at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:485) at mainclass.getP(mainclass.java:38) at mainclass$myThread.run(mainclass.java:79) 1 Vhodit v func... 1 In da func... 1 says: Menay s_name 1 says: Prosnites Vse! 1 Vihodit iz func 1 Vhodit v func... 1 In da func... 1 Begin 2 Wait... Exception in thread "Thread-3" java.lang.IllegalMonitorStateException at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:485) at mainclass.getP(mainclass.java:38) at mainclass$myThread.run(mainclass.java:79)
Короче, они не просыпаются, а как тогда сделать, что б просыпались?
|
|
|
Записан
|
We hate love, we love hate...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 07-12-2007 20:00 » |
|
а зачем ты их усыпляешь то ? Возобновить поток -что нибудь вроде resume ... Где возобновлять потоки ты будешь - я вообще не в курсе , ты логику не продумал, похоже )
зы ты же вроде хотел объекты синхронизации использовать ?
|
|
|
Записан
|
|
|
|
Sandric
Wimdows SUX
Участник
Offline
Пол:
I hate myself and I wanna die
|
|
« Ответ #19 : 07-12-2007 20:09 » |
|
Где возобновлять потоки ты будешь - я вообще не в курсе , ты логику не продумал, похоже ) возобновление потоков (какогото из них) notifyAll() - в функции прописано, но я не знаю, как его вызывать, надо ли держать указатель на екз. того потока, который в момент возобновления ждёт? Я ж у вас спрашиваю, глупенький я...
|
|
|
Записан
|
We hate love, we love hate...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 07-12-2007 20:24 » |
|
(а я ещё хуже - я явы не знаю )) пишу только потому, что остальные почему то молчат... ) конечно через указатель только - а как ещё ? Сам себя поток может тормознуть, а возобновить уже сам себя не может
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #21 : 07-12-2007 20:27 » |
|
Извините, я не местный, а вообще о чем речь идет? Второй день слежу за событиями и никак понять не могу, а причем здесь потоки? Есть два действия: 1.Руки вверх 2.Руки вниз Тьфу, не руки, а крылья. Так вот: почему они должны быть в потоках? Есть один поток полет, но чтоб лететь нужно махать (махнули вниз вызвали процесс взмаха вверх, махнул вверх - вызываем мах вниз) и так до тех пор пока птичка не встретится со снарядом
А потоков действительно должно быть несколько, но никак не связанных с "маханием"
Один поток - полет снаряда от базуки Второй - полет птички
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 07-12-2007 20:38 » |
|
Sla, препод велев 2 потока ))) а ведь я же предлагал один поток как таймер юзать, другой - рабочий
|
|
|
Записан
|
|
|
|
Sandric
Wimdows SUX
Участник
Offline
Пол:
I hate myself and I wanna die
|
|
« Ответ #23 : 07-12-2007 20:48 » |
|
Та не, всё намного проще - нада было всунуть обработчик исключения на странное поведение монитора синхронайзед функции, ну это шоб не писало бред типа Exception in thread "Thread-4" java.lang.IllegalMonitorStateException at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:485) at mainclass.getP(mainclass.java:38) at mainclass$myThread.run(mainclass.java:79) и т.п., и писать не текущий_поток.wait(), a просто wait(), так что конечно через указатель только - а как ещё ? Сам себя поток может тормознуть, а возобновить уже сам себя не может как раз и не надо было. Оказ. вайт и нотифи не синхронизированны, и вызываются только из синхронайзед функций, стопаясь "в" их же исполняемый екземплярах, короче, можно было бы написать внутри рана класса потока шото типа если при этом сам синх. метод написан так: public void getP(){ synchronized(this){ // code } } В общем, меньше возни чем с апи, но пока осознаиш, как именно нада, можна морально разложится...
|
|
|
Записан
|
We hate love, we love hate...
|
|
|
Sla
|
|
« Ответ #24 : 07-12-2007 20:49 » |
|
Так не махать же крыльями в потоке
Если быстро-быстро махать, то завихрения получаются, так и в штопор уйти можно, что и получается. "Ноги, ноги! Хвост! " (с)
Два потока есть Выстрел (снаряд) Махание.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sandric
Wimdows SUX
Участник
Offline
Пол:
I hate myself and I wanna die
|
|
« Ответ #25 : 07-12-2007 20:55 » |
|
Sla, ты не понял, пан сказал - делать нада, а то шо 1 поток- выстрел, 2 - махание, ты не увидеш именно поочередной работы 2 потоков, конешна, у меня будет поток для стреляния, и для перемещения базуки, и будут они с полиморфизмом, и чики-пуки, этот пример именно для усвоения условной работы потоков через синхронайзед функции, кстати вот и он, а то может кому то и понадобатса: import java.applet.*; import java.awt.*; import java.awt.event.*; import java.io.*; import javax.imageio.*;
public class mainclass extends Applet { myThread myT; String s_name; Object sync; public void init() { this.setSize(500, 500); this.setBackground(new Color(81,185,89)); myThread myt1 = new myThread(this,"1"); myThread myt2 = new myThread(this,"2"); s_name = myt2.name; myt1.start(); myt2.start(); }
synchronized public void getP(myThread myTparent){ System.out.println(myTparent.name+" In da func..."); myT = myTparent; if(s_name == myT.name) try{ System.out.println(myT.name+" Begin 2 Wait..."); myT.wait(); }catch(InterruptedException e){System.out.println("jjj"); System.out.println(myT.name + " says: Menay s_name"); s_name = myT.name; System.out.println(myT.name + " says: Prosnites Vse!"); notifyAll(); System.out.println(myT.name + " Vihodit iz func"); } }
class myThread extends Thread{ mainclass applet; String name;
public myThread(mainclass appletparent, String nameparent){ name = nameparent; applet = appletparent;
} public void run(){ for(int i = 0; i<10; i++){
System.out.println(this.name+" Vhodit v func..."); this.applet.getP(this);
} } } } Я тему пока не закрываю, а то ишшо нада буит саму игру доделать
|
|
|
Записан
|
We hate love, we love hate...
|
|
|
Sla
|
|
« Ответ #26 : 07-12-2007 21:04 » |
|
Пан зрозумів, що якийсь дядька молодчику мозги пудрит. Ты ведь не привел Задания, а просто сказал:" Преподаватель сказал в два потока".
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sandric
Wimdows SUX
Участник
Offline
Пол:
I hate myself and I wanna die
|
|
« Ответ #27 : 08-12-2007 07:25 » |
|
Пан зрозумів, що якийсь дядька молодчику мозги пудрит. У! Крут! А что касаетса задания - игра. Все части игры - обрабатываютса потоками, но при этом нужна синхронизация, и по настоянию препода, "если возможно" реализовать в чём-то "поочерёдность" работы потоков, что бы было наглядно видно ихнее управление. Вот вобщим и задание.
|
|
|
Записан
|
We hate love, we love hate...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #28 : 08-12-2007 11:31 » |
|
тогда надо такую вещь замутить : один поток - менеджер , поочереди раздаёт кванты времени потокам , остальные потоки делают квант работы и зависают.
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #29 : 08-12-2007 11:48 » |
|
Хм... У меня задача "как заставить 2 потока работать поочерёдно" почему-то сразу ассоциируется с организацией двух событий (event-ов) - нас так ещё в университете на параллельных компьютерных технологиях учили. Делается так: первый поток ждёт наступления первого эвента, второй - второго. Соответственно, первый при успешном завершении ожидания делает своё чёрное дело и выставляет второй эвент, а второй поток - наоборот, выставляет первый эвент. Остаётся только при запуске этих потоков из основного потока установить какой-то из двух эвентов, задав последовательность. Разве не так?
|
|
|
Записан
|
|
|
|
|