Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #28054 > unrolled thread
| Started by | Roedy Green <see_website@mindprod.com.invalid> |
|---|---|
| First post | 2014-04-12 21:39 -0700 |
| Last post | 2014-04-13 09:29 +0200 |
| Articles | 3 — 2 participants |
Back to article view | Back to comp.lang.java.programmer
distributed initialisation code Roedy Green <see_website@mindprod.com.invalid> - 2014-04-12 21:39 -0700
Re: distributed initialisation code Roedy Green <see_website@mindprod.com.invalid> - 2014-04-12 23:12 -0700
Re: distributed initialisation code Marcel Müller <news.5.maazl@spamgourmet.org> - 2014-04-13 09:29 +0200
| From | Roedy Green <see_website@mindprod.com.invalid> |
|---|---|
| Date | 2014-04-12 21:39 -0700 |
| Subject | distributed initialisation code |
| Message-ID | <hm4kk9ti54lbps7m2o0apm7e61cef7paje@4ax.com> |
I wondered what sort of techniques you use for this sort of problem. Lets say I have a program that processes hundreds of files. Each one may be processed by some set of hundreds of processing modules that may be called many times per file, for different parts of it. In that processing code there is a need for: one-time startup initialisation = handled by static init. shut down = handled by Runtime.getRuntime().addShutdownHook But what about some code that should be run every time a new file is loaded. Possible solutions 1. mix code from many different processors together in a newFileInit method. All those variables must be public. This is very unencapsulated. 2. Pass a boolean to every processor on every call to tell it if this represents a new file. Most of the time, the boolean is of no interest. 3. some kind of way of registering a callback that gets called on reading a new file. Such a scheme might be easily extendable to handle various conditions without disturbing existing code. It would be like addShutdownHook but for more general conditions. Is there a canned solution? -- Roedy Green Canadian Mind Products http://mindprod.com "Don't worry about people stealing an idea; if it's original, you'll have to shove it down their throats." ~ Howard Aiken (born: 1900-03-08 died: 1973-03-14 at age: 73)
[toc] | [next] | [standalone]
| From | Roedy Green <see_website@mindprod.com.invalid> |
|---|---|
| Date | 2014-04-12 23:12 -0700 |
| Message-ID | <5lakk957ff13efhh1i6j8mfduk2q168avl@4ax.com> |
| In reply to | #28054 |
On Sat, 12 Apr 2014 21:39:43 -0700, Roedy Green <see_website@mindprod.com.invalid> wrote, quoted or indirectly quoted someone who said : >3. some kind of way of registering a callback that gets called on >reading a new file. Such a scheme might be easily extendable to >handle various conditions without disturbing existing code. It would >be like addShutdownHook but for more general conditions. Is there a >canned solution? 4. have the processors call boolean methods to see if it is time to do various special processing. -- Roedy Green Canadian Mind Products http://mindprod.com "Don't worry about people stealing an idea; if it's original, you'll have to shove it down their throats." ~ Howard Aiken (born: 1900-03-08 died: 1973-03-14 at age: 73)
[toc] | [prev] | [next] | [standalone]
| From | Marcel Müller <news.5.maazl@spamgourmet.org> |
|---|---|
| Date | 2014-04-13 09:29 +0200 |
| Message-ID | <534a3cc5$0$6721$9b4e6d93@newsspool3.arcor-online.net> |
| In reply to | #28054 |
On 13.04.14 06.39, Roedy Green wrote: > I wondered what sort of techniques you use for this sort of problem. > > Lets say I have a program that processes hundreds of files. Each one > may be processed by some set of hundreds of processing modules that > may be called many times per file, for different parts of it. > > In that processing code there is a need for: > > one-time startup initialisation = handled by static init. > > shut down = handled by Runtime.getRuntime().addShutdownHook > > But what about some code that should be run every time a new file is > loaded. > > Possible solutions > > 1. mix code from many different processors together in a newFileInit > method. All those variables must be public. This is very > unencapsulated. ? > 2. Pass a boolean to every processor on every call to tell it if this > represents a new file. Most of the time, the boolean is of no > interest. This may be a race condition. A processor might receive "new file" while a second one gets another task from that file, but it has been not yet completely initialized. > 3. some kind of way of registering a callback that gets called on > reading a new file. Such a scheme might be easily extendable to > handle various conditions without disturbing existing code. It would > be like addShutdownHook but for more general conditions. Is there a > canned solution? This is still a race condition for the same reason. OK, your callback might be synchronized, but this might block several parallel workers for some time. I would recommend 4.: Take the initialization as a processing task like any other of your tasks but with one exception: the other tasks are not scheduled unless this task has completed. You need a controller anyway that distributes your processing modules over the available resources. This controller might ensure this constraint. So at first only initialization Tasks are scheduled. When one of these tasks completed the corresponding processing tasks of this file are put in the queue. Of course, now you have two kind of processing tasks. But I would not implement this by a boolean. You have three type of objects. - #1 representing the system resources, i.e. the worker threads. - #2 the work items. They can be of different type, but with a common interface. Let us call it ITask. - #3 the scheduler or controller. This is a singleton and handles the work item pool. This object need to be synchronized. Basically this is only a queue, maybe with priorities. So you program operates as follows - Place at lease one initial task in the queue, i.e. a file initialization task. - Spawn the worker threads. - Each worker thread calls some getWork() method of the controller singleton. If it receives NULL, the worker thread terminates. If not, it calls doWork() on the ITask interface. getWork might block if there is currently nothing to do but the worker is likely to be reused later. - doWork might be a file initializer. It does its initialization work and places the required tasks for this file in the global task queue. This concept is widely expansible. You might even have some shut down task for each file. The initialization object for each file might have done it's work already, but that does not mean that it no longer exists. The child task it created may hold a reference to it, maybe simply by using nested classes. And they might notify their parent when their work is done. (The called method of the parent needs to be synchronized!) The parent may count the child tasks and once the last one completed put a final cleanup task in the global queue. The cleanup task might have higher priority to get rid of memory objects more quickly. In this special case the cleanup might be done in place because you are sure that no one can wait for the synchronized method anymore. But be very careful with things like this. Operating in synchronized context for longer might cause serious trouble like deadlocks or simple no parallelism. Marcel
[toc] | [prev] | [standalone]
Back to top | Article view | comp.lang.java.programmer
csiph-web