/*
Milenia Grafter Server
Copyright (c) 2007-2008 by Milan Toth. All rights reserved.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.milgra.server;
/**
ProcessThread class
@mail milgra@milgra.com
@author Milan Toth
@version 20080315
Tasks of Processthread
- Execute related processes
- Add/remove process
- Calculate execution time
**/
import java.util.ArrayList;
public class ProcessThread extends Thread
{
// count - delay check counter
// start - delay check start stamp
// delay - execution time
public int count;
public long start;
public long delay;
// alive - thread is running
// change - change in Process list
public boolean alive;
public boolean change;
// plus - processes to add
// minus - processes to remove
// processes - process list
public ArrayList < OProcess > plus;
public ArrayList < OProcess > minus;
public ArrayList < OProcess > processes;
/**
* Creates a new ProcessThread instance
*/
public ProcessThread ( )
{
// System.out.println( System.currentTimeMillis() + " ProcessThread.construct " );
count = 0;
alive = true;
change = false;
plus = new ArrayList < OProcess > ( );
minus = new ArrayList < OProcess > ( );
processes = new ArrayList < OProcess > ( );
}
/**
* Starts Thread
*/
public void run ( )
{
// System.out.println( System.currentTimeMillis() + " ProcessThread.run " );
try
{
while ( alive )
{
// step all processes
for ( OProcess process : processes ) process.step( );
// process change
if ( change )
{
synchronized ( plus )
{
// add/remove new processes
processes.addAll( plus );
processes.removeAll( minus );
plus.clear( );
minus.clear( );
// calculate delay
if ( count == 2 ) start = System.currentTimeMillis( ); else
if ( count == 1 ) delay = System.currentTimeMillis( ) - start - Library.STEPTIME; else
if ( count == 0 ) change = false;
if ( count != 0 ) count--;
}
}
// sleep for steptime
Thread.sleep( Library.STEPTIME );
}
}
catch ( InterruptedException exception ) { }
}
/**
* Starts a delay check process
*/
public void update ( )
{
//System.out.println( System.currentTimeMillis() + " ProcessThread.update " );
count = 2;
change = true;
}
/**
* Adds new Process
* @param ProcessX process
*/
public void addProcess ( OProcess processX )
{
//System.out.println( System.currentTimeMillis() + " ProcessThread.addProcess " + processX );
synchronized ( plus )
{
plus.add( processX );
change = true;
}
}
/**
* Removes Process
* @param ProcessX process
*/
public void removeProcess ( OProcess processX )
{
//System.out.println( System.currentTimeMillis() + " ProcessThread.removeProcess " + processX );
synchronized ( plus )
{
minus.add( processX );
change = true;
}
}
}