code: private boolean startNewThread(int bucketId) {
          // bucket is in process or doesnt exist
          if (isBucketProcessed(bucketId) || bucketId == -1) {
              log.debug(
                      "Can't add BufferThread. Bucket {} does not exist or a bucket with the same id is already in processing.",
                      bucketId);
              return false;
          }
          Bucket<Data> oldBucket = bucketContainer.getBucket(bucketId);
          // bucket is empty
          if (oldBucket.elementsInBucket == 0) {
              log.debug("Can't add BufferThread. Bucket {} is empty", bucketId);
              return false;
          }
  
          // BlockingQueue is full
          if (bufferThreads.getQueue().size() == allowedBucketsInBuffer) {
              log.debug("Can't add BufferThread. Too many threads in queue. {}", actualProcessingBuckets.toString());
              return false;
          }
  
          actualProcessingBuckets.add(oldBucket);
          // actualProcessingBucketIds.add(bucketId);
          // the old Bucket will be replaced by this new bucket
          try {
              Bucket<Data> newBucket = oldBucket.getEmptyBucketWithSameProperties();
              bucketContainer.setBucket(newBucket);
          } catch (Exception e) {
              e.printStackTrace();
          }
  
          SyncThread<Data> bufferThread = new SyncThread<Data>(this, oldBucket, actualProcessingBuckets,
                  synchronizerFactory, gp);
          bufferThreads.execute(bufferThread);
          return true;
      }
docs: Starts a new {@link SyncThread} with the given <code>bucketId</code>. Returns true if the {@link SyncThread} was
  successful started, false otherwise.<br>
  <br>
  The {@link SyncThread} is not started, if the bucket is empty, already in process or does not exist.
  
  @param bucketId