Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2009, 12:50   #1
Eretic
Пользователь Подтвердите свой е-майл
 
Регистрация: 28.11.2007
Сообщений: 42
По умолчанию Вопрос по потокам

Привет всем кто зайдёт в темку!Вопрос в следующем: в методе Main запускаются 2 потока.
В первом потоке есть:
Код:
public class Thread1 implements Runnable
{
    Thread th2=new Thread(new Thread2());
...

public void met1() throws InterruptedException
    {
        th2.notify();
...
Могу ли я так обращаться ко второму потоку из первого?
Сборка проходит без ошибок, а вот на стадии запуска говорит "Java Result: 1" и указывает именно на "Thread th2=new Thread(new Thread2());"
Цитата:
"Если не хочешь уйти в мир теней,
Первым ударь и,коль сможешь,-убей!" - А.Пехов

Последний раз редактировалось rpy3uH; 07.04.2009 в 13:18.
Eretic вне форума Ответить с цитированием
Старый 01.04.2009, 15:42   #2
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

wait()
notify()
notifyAll()
можно вызывать только в синхронизированном методе.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 01.04.2009, 22:58   #3
Eretic
Пользователь Подтвердите свой е-майл
 
Регистрация: 28.11.2007
Сообщений: 42
По умолчанию

Цитата:
Сообщение от alexinspir Посмотреть сообщение
wait()
notify()
notifyAll()
можно вызывать только в синхронизированном методе.
Это я понимаю и тут убрал для сокращения. synchronized есть, но всё равно проблема то остаётся.
Забыл сказать что ошибка: Exception in thread "main" java.lang.StackOverflowError
Переполнение стека.
Цитата:
"Если не хочешь уйти в мир теней,
Первым ударь и,коль сможешь,-убей!" - А.Пехов

Последний раз редактировалось Eretic; 01.04.2009 в 23:11. Причина: добавление инфы
Eretic вне форума Ответить с цитированием
Старый 01.04.2009, 23:13   #4
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

мну из гильдии телепатов выгнали и лешили способностей, так что весь код в студию, тег [сode] не забываем юзать.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 01.04.2009, 23:30   #5
Eretic
Пользователь Подтвердите свой е-майл
 
Регистрация: 28.11.2007
Сообщений: 42
По умолчанию

ох...Если разберётесь то респект огромный.По задумке прога должна выводить в два потока переданные каждому потоку в конструктор число. Попеременно. Чтобы эти два потока сами друг с другом согласовывали действия.
// класс Main
Код:
package sinx2;

public class Main
{
    public static void main(String[] args)
    {
        Thread per=new Thread(new Thread1(1));
        Thread vtor=new Thread(new Thread2(2));
        per.start();
        vtor.start();
    }
}
//класс первого потока

Код:
package sinx2;

public class Thread1 extends perem implements Runnable
{
    Thread th2=new Thread(new Thread2());
    perem pm=new perem();
    int chislo=0;

    Thread1() {}

    Thread1(int i)
    {
        chislo=i;
    }

    public void run()
    {
        for(int k=0;k<10;k++)
        {
            if(pm.flag==true)
        try {
                met1();
            } catch (InterruptedException ex) {}
        }
    }

    public synchronized void met1() throws InterruptedException
    {
        System.out.print(chislo);  // выводит число
        pm.flag=false;                  // флаг переключается
        th2.notify();                      // возобновление второго потока
        this.wait();                        // а сам этот поток пристоновить
    }
}
// Класс второго потока

Код:
package sinx2;

public class Thread2 extends perem implements Runnable
{
    Thread th1=new Thread(new Thread1());
    perem pm=new perem();
    int chislo=0;

    Thread2() {}

    Thread2(int i)
    {
        chislo=i;
    }

    public void run()
    {
        for(int k=0;k<10;k++)
        {
            if(pm.flag==false)
                try {
                met1();
            } catch (InterruptedException ex) {}
        }
    }

     public synchronized void met1() throws InterruptedException
    {
        System.out.print(chislo); // выводит число
        pm.flag=true;                  // флаг переключается
        th1.notify();                     // возобновление первого потока
        this.wait();                      // а сам этот поток пристоновить
    }
}
// и класс с переменной-флагом.
Код:
package sinx2;

public class perem
{
    boolean flag=true;
}
Цитата:
"Если не хочешь уйти в мир теней,
Первым ударь и,коль сможешь,-убей!" - А.Пехов

Последний раз редактировалось Eretic; 01.04.2009 в 23:31. Причина: очепятка
Eretic вне форума Ответить с цитированием
Старый 02.04.2009, 00:17   #6
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Вроде разобрался.

компилировать времени нету, но по моему алогоритм немного глюкавый.

я бы также стартанул оба потока, но изменил эту часть:
Код:
if(pm.flag==true)
{
   try 
   {
        met1();
   }catch (InterruptedException ex) 
   {
   }
здесь сначала while цикл, который проверяет флаг, если он не тот что нужно, то sleep столько-то милисекунд. а если тот то вайл цикл прекращается и дальше уже идет вызов метода metX().

пробуйте.

p.s. вот единственное за что я ненавижу джаву - дак это за дебильно принятые нормы форматирования. читать огромное блоки кода просто нереально без подсветки фигурных скобок.

Добавлено позже:

да, забыл, когда компилируете пакаджы, то компилировать их надо все сразу, иначе будут ошибки лететь.
for example:
javac Test1.java Test2.java Test3.java
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

Последний раз редактировалось alexinspir; 02.04.2009 в 00:19.
alexinspir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос!!! tigor Общие вопросы Delphi 11 23.10.2009 09:45
Вопрос ) RascaL Помощь студентам 1 30.01.2009 00:24
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10
Вопрос по C++ Sanek_ntsk Свободное общение 3 09.01.2008 14:45