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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Timer + цикл, Timer  
:(
    Опции темы
initmax
Дата 22.12.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Доброго, возникла задача вызывать методы класса, через определённые промежутки времени 

 
Код

 for(int i=0; i<30; i++)
        {
             new java.util.Timer().schedule(new java.util.TimerTask(){
               public void run(){

                  DetailStreem.getNewDetail();
                  System.out.println(DetailStreem.getCountDetail());

 //Вызов метода класса

               }
             }, (1000));
    }


после запуска программы в нетбинсе, в начале пауза, за тем сходу вывод 30 итераций...
1) Как добиться чтобы вызов метода был каждую секунду
2) После выполнения проги в нетбинсе нет вывода "Build complete" но по прежнему весит running, как побороть это?

Это сообщение отредактировал(а) initmax - 22.12.2009, 11:44
PM MAIL   Вверх
LSD
Дата 22.12.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(initmax @  22.12.2009,  11:42 Найти цитируемый пост)
1) Как добиться чтобы вызов метода был каждую секунду

Почитать документацию и выяснить, чем различаются методы 
Код

schedule(TimerTask task, long delay);

и
Код

schedule(TimerTask task, long delay, long period);

 smile 


Цитата(initmax @  22.12.2009,  11:42 Найти цитируемый пост)
2) После выполнения проги в нетбинсе нет вывода "Build complete" но по прежнему весит running, как побороть это?

Надо или остановить таймер:
Код

timer.cancel();

или при создании таймера указать, чтобы использовался поток демон.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
initmax
Дата 22.12.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Странные глюки с таймером..
Тело метод таймера


Код

Timer timer = new Timer(1000, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {

        DetailStreem.getNewDetail();
    //...Perform a task...
    }
});


DetailStreem.getNewDetail(); - уменьшает чисало на 1 при каждом новом вызове


затем стартую таймер и жду пока число не будет = 0, после чего отключаю выполенение таймера
Код

 timer.start();

  while(DetailStreem.getCountDetail() > 0){
      System.out.print(DetailStreem.getCountDetail());
  }
 timer.stop();


 

всё работает, НО если я коменчу строку 
 
Код
 
  while(DetailStreem.getCountDetail() > 0){
   //  System.out.print(DetailStreem.getCountDetail());
  }


из цикла вывалиться не получается число уменьшается до бесконечности...
в чём странный глюк?
PM MAIL   Вверх
LSD
Дата 22.12.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Для начала, добавь Thread.sleep(1) внутрь while. Если не поможет выкладывай полный код.

P.S. И остановись уже на каком нибудь одном таймере, а то скачешь с одного на другой.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
initmax
Дата 23.12.2009, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

Thread.sleep(1)


На сколько мне известно, это приостановка выполнения всей программы, мне же нужны независимые временные занятости оборудования. 
Или я что-то упустил?
PM MAIL   Вверх
LSD
Дата 23.12.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(initmax @  23.12.2009,  10:53 Найти цитируемый пост)
На сколько мне известно, это приостановка выполнения всей программы, мне же нужны независимые временные занятости оборудования. Или я что-то упустил?

Чо? Что такое независимые временные занятости оборудования?

Код

Thread.sleep(1)

Действительно вызывает очень кратковременную приостановку программы. Просто без этого у тебя цикл while будет молотить в пустую и сожрет все процессорное время. Возможно именно поэтому и не срабатывает другой поток, ему просто не хватает процессорного времени. Если так боишься Thread.sleep() замени его на
Код

Thread.yield();

эффект будет схожим.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
initmax
Дата 24.12.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Благодарю за ответ, в теле цикла ставил как Thread.yield(); так и Thread.sleep(1)
На работу программы это ни как не отразилось.

Пока задумался несколько над другим, как реализован констуктор копирования в Java, ибо ситуация следующая:

Если в векторе есть детали, и станок не занят, запускаю станок и передаю ему ОБЪЕКТ деталь на обработку
Код

if(K1.getStatusBusy() == 0 && buferBeforeFirstWork.size() > 0){
          K1.start((Detail)buferBeforeFirstWork.lastElement());//Start detail processing

          buferBeforeFirstWork.remove((buferBeforeFirstWork.size()-1));//delete this detail with bufer
     }



Метод обработки выглядит следующим образом 

Код


  public void start(final Detail objDetail)
     {
       System.out.println("Start machine -> "+name);
       statusBusy=1;
//       this.probabilityDefect(objDetail); //Progress to processing detail...
      
       new java.util.Timer().schedule(new java.util.TimerTask(){
             public void run(){

             probabilityDefect(objDetail);

//             System.out.println("Defect detail after work -> "+objDetail.getDefect());
             outputDetail=objDetail;
             System.out.println("Stop machine -> "+name);
             statusBusy=0;

          }
       }, (workTime));
     }


Т.Е. обработка детали будет происходить через workTime а именно 5 сек.

но тут же не дожидаяьс этих самых 5-ти сек, у удаляю данный объект из вектора
buferBeforeFirstWork.remove((buferBeforeFirstWork.size()-1));//delete this detail with bufer
т.е. когда я начинаю пытаться произвести действия над ОБЪЕКТОМ деталь, его уже просто нету, а метод Start начинает работать с копией ссылкой на ОБЪЕКТ которого уже попросту нет.

в С++ есть конструктор копирования, как в Java это делается корректно?
PM MAIL   Вверх
jk1
Дата 24.12.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

 buferBeforeFirstWork.remove((buferBeforeFirstWork.size()-1));

выполнение этого кода приведет к тому, что ссылка на объект будет удалена из коллекции. Сам объект не будет удален (точнее говоря, не будет собран сборщиком мусора), потому что у вас остается активная ссылка на этот объект. В отличие от C++ в языке Java вы не можете явным образом освободить память, занимаемую объектом.  Значит, в копировании нет никакой необходимости.

Кстати, для коллекций FIFO(LIFO) удобнее пользоваться какой-либо реализацией интерфейса Queue 


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
initmax
Дата 25.12.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Благодарю за ответ, но с перепугу реализовал клонирование
Код


 class MyClass implements Cloneable {
        public MyClass() {
        }
        public Object clone() {
            Cloneable theClone = new MyClass();
            // Initialize theClone.
            return theClone;
        }
    }
Here's some code to create a clone. 
    
MyClass myObject = new MyClass();
    MyClass myObjectClone = (MyClass)myObject.clone();



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


Бывалый
*


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

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



Закончил написание, 
Задание такое:

На обрабатывающий участок цеха поступают детали в среднем через 50 мин. Первичная обработка деталей производится на одном из двух станков. Первый станок обрабатывает деталь в среднем 40 мин. и имеет до 4% брака, второй соответственно 60 мин и имеет 8% брака. Все бракованные детали возвращаются на повторную обработку на второй станок. Детали попавшие в разряд бракованных дважды, считаются отходами. Вторичную обработку проводят также два станка в среднем 100 мин каждый. Причём первый станок обрабатывает имеющиеся в накопителе после первичной обработки детали, а второй станок подключается при образовании в накопителе задела больше 3-х деталей. Все интервалы времени распределены по экспоненциальному закону. 
Смоделировать обработку на участке 500 деталей. Определить загрузку второго станка на вторичной обработке и вероятность появления отходов. Определить возможность снижения задела в накопителе и повышения загрузки второго станка на вторичной обработке.

Реализация:
Код


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import java.io.*;
import java.lang.*;
import javax.swing.Timer;

/**
 */

class FlapStream {
    private static double countDetail=0;
    private static int timeGetDetail=0;
    private int entryDetail=0;

    public FlapStream(double countDetail, int timeGetDetail){
        this.countDetail=countDetail;
        this.timeGetDetail=timeGetDetail;
    }
 
    public FlapStream(){}

//transmit next detail to stream
    public void getNewDetail(){
         new java.util.Timer().schedule(new java.util.TimerTask(){
             public void run(){
                 System.out.println("Count detail at rest -> "+countDetail);
                 countDetail--;
                 entryDetail=1;
//             System.out.println("Defect detail after work -> "+objDetail.getDefect());
          }
       }, (timeGetDetail));
         
    }

//set/get
    public double getCountRestDetails(){
        return countDetail;
    }

    public int getFlagAtFalp(){
        return entryDetail;
    }

    public void setFlagZeroAtFalp(){
        this.entryDetail=0;
    }

}


//First processing bufer
class BuferBeforeFirstWork{
    private Vector buferBeforeFirstWork;//Вufer details before first work.

    public BuferBeforeFirstWork(){
        buferBeforeFirstWork = new Vector();
    }

    public Vector getBuferBeforeFirstWork(){
        return buferBeforeFirstWork;
    }

    public Detail getObjectFromId(int id){
        return (Detail)buferBeforeFirstWork.elementAt(id);
    }

    public int getCountElementsInVector(){
        return buferBeforeFirstWork.size();
    }

    public void setObjectAddLastElement(Detail objDetail){
     buferBeforeFirstWork.add(objDetail);
    }

    public void setObjectDeleteInVector(int id){
        buferBeforeFirstWork.removeElementAt(id);
    }

}

//Second processing bufer
class BuferAfterFirstWork{
    private Vector buferAfterFirstWork;//Вufer details before first work.


    public BuferAfterFirstWork(){
        buferAfterFirstWork = new Vector();
    }

    public Vector getBuferAfterFirstWork(){
        return buferAfterFirstWork;
    }

    public Detail getObjectFromId(int id){
        return (Detail)buferAfterFirstWork.elementAt(id);
    }

    public int getCountElementsInVector(){
        return buferAfterFirstWork.size();
    }

    public void setObjectAddLastElement(Detail objDetail){
     buferAfterFirstWork.add(objDetail);
    }

    public void setObjectDeleteInVector(int id){
        buferAfterFirstWork.removeElementAt(id);
    }

}

//        Vector buferAfterFirstWork = new Vector(); //Вufer details after first worked.



class Detail implements Cloneable {
//because the system is two-phases, need set level of processing detail
    private int Defect=0;


    public void setDefect(int Defect){
        this.Defect = Defect;
    }

//geters

    public int getDefect(){
        return Defect;
    }
//FOR clone detail
    public Object getCloneObject(){
        Cloneable theClone = new Detail();
        return theClone;
    }
    
}


class Machine
{
     private String name=null;
     private int workTime=0;
     private int defect=0;
     private int statusBusy=0;
     private Detail outputDetail=null;
     private double countStartMachine=0; //count to start machine;

     public Machine(int workTime, int defect, String name)
     {
       this.workTime=workTime;
       this.defect=defect;
       this.name=name;
     }

//Set work machine
     public void start(final Detail objDetail)
     {
       System.out.println("Start machine -> "+name);
       statusBusy=1;
      
       new java.util.Timer().schedule(new java.util.TimerTask(){
             public void run(){
                 probabilityDefect(objDetail);
//             System.out.println("Defect detail after work -> "+objDetail.getDefect());
                 outputDetail=objDetail;
                 System.out.println("Stop machine -> "+name);
                 countStartMachine++;
                 statusBusy=0;
          }
       }, (workTime));
     }

//generation the probability defect
     private void probabilityDefect(Detail objDetail){
        int getDefect=0;
        getDefect = (int)(100*Math.random());

        System.out.println("defect detail"+name+"="+getDefect);

//set the defect level from our detail
        if(getDefect < defect){
            if(objDetail.getDefect() == 0){
                objDetail.setDefect(1);
            }

            if(objDetail.getDefect() == 1){
                objDetail.setDefect(2);
            }
        }
     }

//set/get
     public int getWorkTime() {
         return workTime;
     }

     public int getStatusBusy(){
         return statusBusy;
     }

     public String getName(){
         return name;
     }

     public Detail getDetailAfterProcessing(){
       return outputDetail;
     }

     public double getCountStartMachine(){
       return countStartMachine;
     }

     public void setCleanDetailAfterProcessing(){
       this.outputDetail = null;
     }

}



public class Main {
    private static int timeFlapStream = 50;
    private static int timeK1Worked = 40;
    private static int timeK2Worked = 60;
    private static int timeK3Worked = 100;
    private static int timeK4Worked = 100;
    
    private static int defectK1Worked = 4;
    private static int defectK2Worked = 8;
    private static double countDefectDetails=0;

    public static void main(String[] args) throws InterruptedException {

        double CountDetail=0;
       
        Machine K1 = new Machine(timeK1Worked,defectK1Worked,"K1");
        Machine K2 = new Machine(timeK2Worked,defectK2Worked,"K2");
        Machine K3 = new Machine(timeK3Worked,0,"K3");
        Machine K4 = new Machine(timeK4Worked,0,"K4");

        Scanner in = new Scanner(System.in);
       
        System.out.println("Enter count details");
        CountDetail = in.nextDouble();
        final FlapStream detailStream = new FlapStream(CountDetail,timeFlapStream); //Count detail in flap stream


//Create bufers for worked details
  BuferBeforeFirstWork buferBeforeFirstWork=new BuferBeforeFirstWork();
  BuferAfterFirstWork buferAfterFirstWork=new BuferAfterFirstWork();


//Transmit new detail to stream
detailStream.getNewDetail();

long time = System.currentTimeMillis();
while(buferBeforeFirstWork.getCountElementsInVector() > 0 || buferAfterFirstWork.getCountElementsInVector() > 0 || detailStream.getCountRestDetails() > 0){

  Thread.yield(); //Кратковременная приостановка программы дабы цикл не сожрал всё процессорное время!   


//WHY !&&&&&????
  System.out.print("");


//IF we gets a new incoming detail
     if(detailStream.getFlagAtFalp() == 1) {
         System.out.print("***shot a new detail ->"+(detailStream.getCountRestDetails()+1)+"\n");
         
         Detail objDetail = new Detail(); //Create a new detail
         buferBeforeFirstWork.setObjectAddLastElement(objDetail);//Add detail to bufer

        if(detailStream.getCountRestDetails() > 0) {detailStream.getNewDetail();} //if there are details into flap
         detailStream.setFlagZeroAtFalp();//Set to zero detail into stream, "take detail"
     }

//=======================================================
//First phase of the machining

//check is a free machine from processing detail and existence detail into bufer
     if(K1.getStatusBusy() == 0 && buferBeforeFirstWork.getCountElementsInVector() > 0){
          Detail detail = new Detail();
          int lastElementInVector = (buferBeforeFirstWork.getCountElementsInVector()-1);

          detail = buferBeforeFirstWork.getObjectFromId(lastElementInVector);
          Detail cloneDetail = (Detail)detail.getCloneObject();//Cloning details
          buferBeforeFirstWork.setObjectDeleteInVector(lastElementInVector);
          K1.start(cloneDetail);
     }


     if(K2.getStatusBusy() == 0 && buferBeforeFirstWork.getCountElementsInVector() > 0){
          Detail detail = new Detail();
          int lastElementInVector = (buferBeforeFirstWork.getCountElementsInVector()-1);//Count elements in vector

          detail = buferBeforeFirstWork.getObjectFromId(lastElementInVector);
          Detail cloneDetail = (Detail)detail.getCloneObject();//Cloning details
          buferBeforeFirstWork.setObjectDeleteInVector(lastElementInVector );//delete last object with vector
          K2.start(cloneDetail);//start to work   
     }


//=======================================================
//Check details after processing the machine K1
     if(K1.getDetailAfterProcessing() !=null){
         Detail detailAfterWorkK1;
         detailAfterWorkK1 = K1.getDetailAfterProcessing();

         if(detailAfterWorkK1.getDefect() == 0 || detailAfterWorkK1.getDefect() == 1){ //if not defects after worked
             buferAfterFirstWork.setObjectAddLastElement(detailAfterWorkK1);
         }

//OPTIMIZATION
         else if(detailAfterWorkK1.getDefect() == 2){ //if not defects after worked
             countDefectDetails++;
         }
         K1.setCleanDetailAfterProcessing();
     }

//Check details after processing the machine K2
     if(K2.getDetailAfterProcessing() !=null){
         Detail detailAfterWorkK2;
         detailAfterWorkK2 = K2.getDetailAfterProcessing();

         if(detailAfterWorkK2.getDefect() != 2){ //if not defects after worked
             buferAfterFirstWork.setObjectAddLastElement(detailAfterWorkK2);
         }

//OPTIMIZATION
         else if(detailAfterWorkK2.getDefect() == 2){ //if not defects after worked
             countDefectDetails++;
//HOW worked delete object?
//             delete detailAfterWorkK2;
         }
         K2.setCleanDetailAfterProcessing();
     }


//=======================================================
//Secondary phase of the machining
     if(K3.getStatusBusy() == 0 && buferAfterFirstWork.getCountElementsInVector() > 0){
          Detail detail = new Detail();
          int lastElementInVector = (buferAfterFirstWork.getCountElementsInVector()-1);

          detail = buferAfterFirstWork.getObjectFromId(lastElementInVector);
          Detail cloneDetail = (Detail)detail.getCloneObject();//Cloning details
          buferAfterFirstWork.setObjectDeleteInVector(lastElementInVector);
          K3.start(cloneDetail);
     }

     if(K4.getStatusBusy() == 0 && buferAfterFirstWork.getCountElementsInVector() > 0){
          Detail detail = new Detail();
          int lastElementInVector = (buferAfterFirstWork.getCountElementsInVector()-1);

          detail = buferAfterFirstWork.getObjectFromId(lastElementInVector);
          Detail cloneDetail = (Detail)detail.getCloneObject();//Cloning details
          buferAfterFirstWork.setObjectDeleteInVector(lastElementInVector);
          K4.start(cloneDetail);
     }


//STOP WHILE
  }


  System.out.print("Bufer one == "+ buferAfterFirstWork.getCountElementsInVector()+"\n");
  System.out.print("Bufer two == "+ buferAfterFirstWork.getCountElementsInVector()+"\n");


  System.out.print("Count defect details == "+countDefectDetails+"\n");
  System.out.print("Interest defect details == "+((countDefectDetails*(double)100)/CountDetail)+"%\n");
  System.out.print("Run the machine on a secondary processing - 'count starts' == "+ K4.getCountStartMachine()+"\n");
  System.out.print("Run the machine on a secondary processing - 'count interest' == "+((K4.getCountStartMachine()*(double)100)/CountDetail+"%\n"));


  System.out.print("\n\nRunning time ==" + (System.currentTimeMillis() - time) + " ms" + "\n\n");
  System.exit(0);

 }

}




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

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

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


 




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


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

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