Here is one possible approach for you to think about. (Fyi, i have done file processing using spring-batch and threading using the strategy i am outlining here. But that code belongs to my company and cannot share it.)
I would suggest you read these articles to understand how to scale up using spring-batch.
First, spring-batch documentation
https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html
Next, a good post from stackoverflow itself.
Best Spring batch scaling strategy
After reading both and understanding all the different ways, i would suggest you concentrate on Partitioning,
https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html#partitioning
This is the technique i used as well. In your case, you can spawn the number of threads for each file from the partitioner.
You may need to maintain the state, ie, if the file is assigned to a thread or not. 'Processing' and 'Completed Processing' also could be states in your code.
This depends on your requirement. (I had a whole set of states maintained in a singleton which all threads would update after picking up a file, and finished processing a file etc)
You also need to think about finishing each file before the 4 hour window is over. You may be able to keep the file as is, or you may want to move this to a new location while processing. or rename the file while processing. Again it depends on your requirements. But you need to think about this scenario. (In my case, i renamed the file by adding a unique suffix made of timestamp in milliseconds , so it could not be overwritten by new file. )
Finally, a sample from a blog which processes 5 csv files through partitioner.
You can start from this sample.
https://www.baeldung.com/spring-batch-partitioner
And search for more samples to see if this is the approach you want to take. Good luck.