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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбудить основной Thread из порождённых им. 
:(
    Опции темы
Orange
Дата 31.7.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 6.9.2004
Где: Russia, Moscow

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



Привет, помогите разобраться. Не получается пробудить основной трэд :

Код

Thread t = new Thread(){
  public void run(){
     Runtime runtime = Runtime.getRuntime();
     Process p = runtime.exec("task1.bat");
     new Startruntime(p, 650);
  
     p = runtime.exec("task2.bat");
     new Startruntime(p, 1000);
//.....

  }

}
t.setName("Basic thread");
t.start();


Код

public class Startruntime{

 Process p;
 Thread t1,t2;
 int limit;
 boolean isValue;

 public Startruntime(Process p, int limit) {
    
  this.p = p;
  this.limit = limit;

  try {
    go();
  } catch (InterruptedException e) {
    e.printStackTrace();
    }
        
 }

 synchronized void go() throws InterruptedException{
        
        
     t1 = new LoadBar("asdasd");
     t1.setName("one thread");
     t2 = new WaitFor(p);
     t2.setName("two thread");
        
     t1.start();
     t2.start();
     wait(); // "Basic thread" уснул
    
     System.out.println("unreachable");
     System.out.println("awake");
     System.out.println("awake");
     System.out.println("awake");
     t1.join();
     t2.join();


 class LoadBar extends Thread{

  public void run{

   synchronized (this) {
    while (true) {
     if (isValue) {
      break;
     }
    }
    notify(); //а здесь "Basic thread" не хочет просыпается!!
    //notifyAll();
    frame.dispose();
   }
  }

 }

 class WaitFor extends Thread{

  public void run(){
   p.waitFor();
   isValue = true;
  }

 }

}


Добавлено через 11 минут и 8 секунд
Есть такая мысль, поток не будится потому что notify вызывается на объекте LoadBar...
Тогда не пойму, как его вызвать в LoadBar-е на объекте Startruntime?
--------------------
Пару дней назад я познакомился с мальчиком......
PM MAIL ICQ   Вверх
ivg
Дата 31.7.2008, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

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



Цитата(Orange @  31.7.2008,  18:21 Найти цитируемый пост)
как его вызвать в LoadBar-е на объекте Startruntime? 

Код

51:        Startruntime.this.notify(); //а здесь "Basic thread" не хочет просыпается!!



PM MAIL   Вверх
Orange
Дата 31.7.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 6.9.2004
Где: Russia, Moscow

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



Exception in thread "one thread" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at model.StartRuntime$LoadBar.run(StartRuntime.java:95)

 smile 
--------------------
Пару дней назад я познакомился с мальчиком......
PM MAIL ICQ   Вверх
Dummy
Дата 31.7.2008, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



45-ю строчку измени на
Код

synchronized (Startruntime.this)


Это сообщение отредактировал(а) Dummy - 31.7.2008, 18:40
PM MAIL   Вверх
Orange
Дата 1.8.2008, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 6.9.2004
Где: Russia, Moscow

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



Exception in thread "Basic Thread" java.lang.IllegalMonitorStateException
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:485)
        at Startruntime.go(Startruntime.java:38)
        at Startruntime.<init>(Startruntime.java:17)
        at ProcessClass.startProcess(ProcessClass.java:17)
        at BasicThread.prepareProcess(BasicThread.java:21)
        at BasicThread.run(BasicThread.java:14)
--------------------
Пару дней назад я познакомился с мальчиком......
PM MAIL ICQ   Вверх
Orange
Дата 1.8.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 6.9.2004
Где: Russia, Moscow

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



Вот убрал всё лишнее из кода, оставил только работу трэдов.
(Уже все варианты synchronized/notify перебрал - то IllegalMonitorStateException в "Basic Thread", то в "one thread" либо ексепшенов нет, но поток не просыпается.  smile 
Где я накосячил?

Main
Код

public class Main{

 public static void main(String[] args){

 Thread basicThread = new BasicThread("test1");
 basicThread.setName("Basic Thread");
 basicThread.start();

 }
}


BasicThread
Код

import java.io.*; 

public class BasicThread extends Thread{

 String name;

 public BasicThread(String name){

  this.name = name;
 }

 public void run(){

  prepareProcess(name);
 }

 void prepareProcess(String name){

  ProcessClass procClass = new ProcessClass(name);
  try{
  procClass.startProcess();
  }
  catch(IOException ioe){
   ioe.printStackTrace();
  }

 } 
}


Запуск процессов:
Код

import java.io.*;

public class ProcessClass{

 String name;
 Startruntime str;

 public ProcessClass(String name){
  
  this.name = name;
 }

 void startProcess() throws IOException{

  Runtime runtime = Runtime.getRuntime();
  Process p = runtime.exec("l.bat");  
  str = new Startruntime(p, 650);

  p = runtime.exec("l.bat");  
  str = new Startruntime(p, 300);

 }
}


Ожидание завершения запущенного процесса, в котором и выбрасывается эксепшен на notify
Код

import java.io.*;
import javax.swing.*;

public class Startruntime{

 Thread t1,t2;
 Process p;
 int limit;
 boolean isValue;

 public Startruntime(Process p,int limit){

  this.p = p;
  this.limit = limit;
  
  try{
    go();
  }catch (InterruptedException e){
    e.printStackTrace();
  }

 }

 void go() throws InterruptedException{

  t1 = new LoadBar();
  t1.setName("one thread");
  t2 = new WaitFor(p);
  t2.setName("two thread");

  t1.start();
  Thread.sleep(100);
  t2.start();
  System.out.println("before wait");

 //synchronized (this) {
  System.out.println(Thread.currentThread().getName() + " in wait");
  wait();
  System.out.println(Thread.currentThread().getName() + " end wait");
 //}

 
  System.out.println("awake");

  t1.join();
  t2.join();
  System.out.println(Thread.currentThread().getName());

 }

 class LoadBar extends Thread{

  JFrame frame;
  LoadBar(){

   JFrame.setDefaultLookAndFeelDecorated(true);
   frame = new JFrame();
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   //JComponent newContentPane = new PrgBar(limit);
   //newContentPane.setOpaque(true);
   //frame.setContentPane(newContentPane);
   frame.pack();
   frame.setLocationRelativeTo(null);
   frame.setVisible(true);

  }

  public void run() {


    System.out.println(Thread.currentThread().getName() + "in loadBar");

    synchronized (Startruntime.this){

    while (true) {
     if (isValue) {
      Startruntime.this.notify();
       System.out.println("asasas");
       break;
     }
    }
    frame.dispose();
       }
    }
 }

 class WaitFor extends Thread {
 
  Process p;
   
  WaitFor(Process p){
   this.p = p;
  }

  public void run() {

   try{

    System.out.println(Thread.currentThread().getName() + "in WaitFor");
    p.waitFor();
    isValue = true;

   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }

}


Добавлено через 5 минут и 35 секунд
Я уже вместо wait/notify ловлю основной поток в цикл
while (!isMyWait) {
  if (isMyWait) {
     isMyWait = isValue = false;
    break;
  }
}

и после отработки  waitFor() делаю isMyWait = true,  но мне кажется, что это какое-то дурацкое решение... да и в любом случае хотелось бы разобраться с проблемой.

--------------------
Пару дней назад я познакомился с мальчиком......
PM MAIL ICQ   Вверх
Orange
Дата 1.8.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 6.9.2004
Где: Russia, Moscow

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



Так, всё-таки я эксепшн победил.  smile 

Сделал метод go() synchronized (хотя вариант с 
Код

void go(){
//....
synchronized (this) {
  System.out.println(Thread.currentThread().getName() + " in wait");
  wait();
  System.out.println(Thread.currentThread().getName() + " end wait");
}
}

не работал.. (так я и не понял почему)
и убрал join на треды t1 и t2.
(тоже не понятно почему с ними не работало..)

Пока тему не буду закрывать, может кто-нибудь откоментирует о вышесказанном.
--------------------
Пару дней назад я познакомился с мальчиком......
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.0773 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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