From what you write it seems that a Queue is beffer fit; your threads push sensor data on the queue and later (perhaps with another thread) you can take elements from the queue and process them.
Java (at least version 7 and 8) offers some different queue implementations, even for usage in a multithreaded environment.
As Turing85 wrote in his comment consider the usage of a thread pool instead of a creating a thread for each sensor.
EDIT: reading the comment it seems there are tow different kind of problems
how to efficiently query the sensors (threads, tasks, pools, etc)
Form the questions it seems that you are connecting to the sensors to read the data, and this must be done at fixed rate for each sensor. You can use a ScheduledThreadPoolExecutor and use the method scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) where Runnable is the Object thar read the data from sensor; you must schedule a taks for each sensor; the thread pool size is specified in the constructor. In order to minimize the thread number you must do the less you can in the class that reads the data. I suggest you to pust the data in a Queue or in a Map or in Set, it depends how your data sre stuctured. The map is the same as the vector you proposed, but instead of using the index you can use generic key to insert the data, and you don't care of sizing the collection.
and how to efficiently organize the data for subsequent database
submission
After the data are in the collection you can read and process them; you can store in a database, or check for duplicates or whatever you need. I prefer having two different "layers", one collects the data the other one process what has been collected; putting an "interface" between the two allows your design to evolve only one side without touching the other one.
NOTE: my solution allows you to lost data, if for some reason the server goes down, the data in the collection that has not been processed is not available anymore.