-- $Id: java_thread_api.ty,v 1.7 99/08/10 14:49:17 hnilsson Exp $ -- /***************************************************************************/ -- /* Copyright (C) 1997-1999 INRIA Sophia-Antipolis */ -- /* I. Attali, D. Caromel and M. Russo */ -- /* Projet OASIS */ -- /* Rt. des Lucioles, BP 93, */ -- /* F-06902 Sophia Antipolis cedex */ -- /* (+33) 4 92 38 76 31 */ -- /* All rights reserved */ -- /***************************************************************************/ -- -- /***************************************************************************/ -- /* This file contains the API specifications for the Thread class */ -- /* Specified APIs: Thread(), resume(), start(), suspend() */ -- /***************************************************************************/ program java_thread_api is use java; use PSP; import getObject ( ObjectId |- Objects -> Object ) , createExceptionObject ( Objects, ObjectId |- Identifier, ExceptText -> ObjectId, Objects, Insts ) , setNewThreadStatus ( ObjectId, ThreadStatus, ClassVariablesL |- Objects -> Objects ) from java_object_list; import diff ( _, _ ) , not_eq ( _, _ ) from prolog() ; set ThreadAPI is --SC: Performs all the Thread constructors and methods. -- --SC: Specified constructor and methods: --SC: Thread() --SC: resume() --SC: start() --SC: suspend() -- --JC: Object list, Class variable list, Current executing thread reference, --JC: Current object reference --JC: |- Method or Constructor name, Argument list (maybe empty) --JC: -> modified object list, modified class variable list, --JC: Continuation instruction list (maybe empty), new current Thread status judgement Objects, ClassVariablesL, Ref, Ref |- Identifier, java -> Objects, ClassVariablesL, Insts, ThreadStatus; Thread: --RC: Allocates a new Thread object. -- --CS: new Thread(); ObjL, ClVarL, _, ObjId |- identifier "Thread", vals[] -> ObjL, ClVarL, insts[ clr( ObjId, identifier "none", identifier "Thread", env(pairs[], locs[]), insts[constructorCall1(identifier "Object", arguments[], ObjId)])], runnable() ; Resume: --RC: Resumes a suspended Thread. -- --CS : OThId.resume(); getThreadStatus( OThId |- ObjL1 -> suspended(ThStatus) ) & setNewThreadStatus( OThId, ThStatus, ClVarL |- ObjL1 -> ObjL1_1 ) -------------------------------- ObjL1, ClVarL, _, OThId |- identifier "resume", vals[] -> ObjL1_1, ClVarL, insts[], runnable() ; Start: --RC: Causes the thread to pass from the created status into the runnable --RC: status to begin its execution (the JVM calls the "run" method). -- --CS: OThId2.start(); getThreadStatus( OThId |- ObjL1 -> created(_) ) & setNewThreadStatus( OThId, runnable(), ClVarL |- ObjL1 -> ObjL1_1 ) -------------------------------- ObjL1, ClVarL, _, OThId |- identifier "start", vals[] -> ObjL1_1, ClVarL, insts[], runnable() ; Start_ThreadAlreadyDead_DoNothing: -- --CS: OthId2.start(); getThreadStatus( OThId |- ObjL1 -> dead() ) -------------------------------- ObjL, ClVarL, _, OThId |- identifier "start", vals[] -> ObjL, ClVarL, insts[], runnable() ; Start_ThreadAlreadyStarted_ExceptionThrown: --RC: The IllegalThreadStateException is thrown because the given thread --RC: was already started. -- --CS: OthId2.start(); getThreadStatus( OThId2 |- ObjL1 -> ThStatus ) & not_eq( ThStatus, created(_) ) & not_eq( ThStatus, dead() ) & createExceptionObject( ObjL1, OThId1 |- identifier "IllegalThreadStateException", exceptText "Method 'start' called on an already started thread." -> _, ObjL1_1, InstL ) -------------------------------- ObjL1, ClVarL, OThId1, OThId2 |- identifier "start", vals[] -> ObjL1_1, ClVarL, InstL, runnable() ; Suspend_ExecutingThread: --RC: suspends the current executing thread. -- --CS: OThId.suspend(); setNewThreadStatus( OThId, suspended(runnable()), ClVarL |- ObjL1 -> ObjL1_1 ) -------------------------------- ObjL1, ClVarL, OThId, OThId |- identifier "suspend", vals[] -> ObjL1_1, ClVarL, insts[], suspended(runnable()) ; Suspend_NotTheExecutingThread: --RC: suspends another thread than the current executing thread -- --CS: OThId2.suspend(); getThreadStatus( OThId2 |- ObjL1 -> ThStatus ) & setNewThreadStatus( OThId2, suspended(ThStatus), ClVarL |- ObjL1 -> ObjL1_1 ) -------------------------------- ObjL1, ClVarL, OThId1, OThId2 |- identifier "suspend", vals[] -> ObjL1_1, ClVarL, insts[], runnable() ; provided diff( OThId1, OThId2 ); set getThreadStatus is --SC : Returns the status for the given thread. judgement ObjectId |- Objects -> ThreadStatus; GetStatus: getObject( OThId |- ObjL -> object(OThId, _, _, _, _, activity(ThStatus, _)) ) -------------------------------- OThId |- ObjL -> ThStatus ; end getThreadStatus ; end ThreadAPI; end java_thread_api