Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация 2-х потоков, не пашит лаба! F1! 
V
    Опции темы
Sandric
Дата 7.12.2007, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 7.12.2007

Репутация: нет
Всего: нет



Люди, если я пойму почему не пашит это, наверно сделаю лабу! 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...


Кто знает, почему не по порядку идёт, отпишитесь!

Это сообщение отредактировал(а) powerOn - 7.12.2007, 21:27
PM MAIL   Вверх
Aristotelb
Дата 7.12.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 23.3.2007
Где: Саратов

Репутация: 4
Всего: 5



1. почему wait\notifyAll не в synhronized блоке?
2. почему wait - вызывается у myT а notifyAll у this?


PM MAIL ICQ   Вверх
Sandric
Дата 7.12.2007, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 7.12.2007

Репутация: нет
Всего: нет



Ну а как надо?

wait notifyAll в synchronized методе класса, а wait вызывается для переданного екз. myThread, а notifyAll незнаю, я ж всем потокам разрешаю возобоновлять работу.

Отредактируй так чтоб работало, плз  smile 
PM MAIL   Вверх
Sandric
Дата 7.12.2007, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 7.12.2007

Репутация: нет
Всего: нет



Ой, я дико извиняюсь, не стесняйтесь, материтесь, я дужку забыл, гыгы (голосом Регины Дубовицкой...) код такой:

Код:

Цитата


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)



Короче, они не просыпаются, а как тогда сделать, что б просыпались?
PM MAIL   Вверх
Aristotelb
Дата 7.12.2007, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 23.3.2007
Где: Саратов

Репутация: 4
Всего: 5



Незнаю что редактировать, ибо в корне неверно smile 

что должно получиться-то?
PM MAIL ICQ   Вверх
Antropoid
Дата 7.12.2007, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: 2
Всего: 16



Код

package crazy.vpf;

import java.applet.*;
import java.awt.*;

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");
            }catch(IllegalMonitorStateException imse) {
                System.out.println("iii");
            }
            
            // вот тут я и провмыкал...
        }
        
        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<20; 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);
            }
            
        }
    }
}    



--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Sandric
Дата 7.12.2007, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 7.12.2007

Репутация: нет
Всего: нет



ну должно по очереди писать вход и выход из синхронайзед функции. 
Вот у меня сначала s_name = 2, значит, оно пишет, что 2 поток вошел в функцию, и уснул (wait), потом вошел 1, не уснул, (так и нужно), изменил s_name - оно показывает имя пред. потока, и вышел, "как бы" включил все потоки (отменил wait в очереди потоков) и вышел, снова вошёл, вып. условие по которому он прошлый раз уже входил, и сейчас не его очередь, и он должен уснуть, и все. А нада, чтобы "включённый" 2 поток предыдущим потоком заходил в функцию и так продолжалось 10 раз для каждого потока.

Короче, как возобновить работу потока, у меня notifyAll() не работает получается?
PM MAIL   Вверх
Sandric
Дата 7.12.2007, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 7.12.2007

Репутация: нет
Всего: нет



От обработчика исключения смысл не поменялся - просто начало писать ошибку, но оно заработало! Я понял, нада было писать не текущий_поток.wait а просто wait! smile 
PM MAIL   Вверх
Aristotelb
Дата 7.12.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 23.3.2007
Где: Саратов

Репутация: 4
Всего: 5



Код

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 = new Object();
    
    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();
        
    }
    
    public void getP(myThread myTparent){
        
        System.out.println(myTparent.name+" In da func...");
        
        myT = myTparent;
        
        if(s_name == myT.name){
            synchronized (sync){
                try {
                    sync.wait();
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
        }
        
        System.out.println(myT.name + " says: Menay s_name");
        
        s_name = myT.name;
        
        System.out.println(myT.name + " says: Prosnites Vse!");
        
        synchronized (sync){
            sync.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);
            }
            
        }
    }
}


Это сообщение отредактировал(а) Aristotelb - 7.12.2007, 23:44
PM MAIL ICQ   Вверх
Antropoid
Дата 7.12.2007, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: 2
Всего: 16



Цитата(Sandric @  7.12.2007,  23:18 Найти цитируемый пост)
Вот у меня сначала s_name = 2, значит, оно пишет, что 2 поток вошел в функцию, и уснул (wait)

нет. Сначала заходит 1 поток, и оно пишет, что 1 поток воел в функцию.

Цитата(Sandric @  7.12.2007,  23:18 Найти цитируемый пост)
потом вошел 1, не уснул, (так и нужно)

с чего ты взял, что потом войдет 1 поток???

Есть четкая формулировка задания?

Добавлено через 3 минуты и 35 секунд
Цитата(Sandric @  7.12.2007,  23:36 Найти цитируемый пост)
От обработчика исключения смысл не поменялся - просто начало писать ошибку,

какую ошибку? У меня все ОК.

Цитата(Sandric @  7.12.2007,  23:36 Найти цитируемый пост)
 Я понял, нада было писать не текущий_поток.wait а просто wait!

Так это ж одно и то же.


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
Sandric
Дата 8.12.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 7.12.2007

Репутация: нет
Всего: нет



Цитата

Вот у меня сначала s_name = 2, значит, оно пишет, что 2 поток вошел в функцию, и уснул (wait)


То у меня писалось раньше, просто потоки видно создавались одновременно, и иногда первым заходил 2, иногда первы1...

Цитата

какую ошибку? У меня все ОК.


Ту, которую ты поставил в обработчике - выводило "iii", и снова ишло не правильно.

Цитата

Так это ж одно и то же. 


Не знаю, когда я так писал, потоки потом не просыпались. Вот даже Aristotelb написал(а) 
Цитата
sync.wait();
, что тоже самое, что this.wait, если сам метод синхронайзед.

Вобщем, спасибо всем за ответы, вы мне очень помогли. smile 
PM MAIL   Вверх
Aristotelb
Дата 8.12.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 23.3.2007
Где: Саратов

Репутация: 4
Всего: 5



Цитата(Sandric @  8.12.2007,  10:45 Найти цитируемый пост)
Не знаю, когда я так писал, потоки потом не просыпались. Вот даже Aristotelb написал(а) Цитатаsync.wait();, что тоже самое, что this.wait, если сам метод синхронайзед.


Небыло такого! smile 

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.