diff -u vixie-cron-4.1-pristine2/cron.c vixie-cron-4.1-2/cron.c
--- vixie-cron-4.1-pristine2/cron.c	2009-06-15 22:47:10.000000000 -0600
+++ vixie-cron-4.1-2/cron.c	2009-06-15 22:51:48.000000000 -0600
@@ -26,6 +26,7 @@
 #define	MAIN_PROGRAM
 
 #include "cron.h"
+#include <pthread.h>
 
 enum timejump { negative, small, medium, large };
 
@@ -72,6 +73,10 @@
 #endif
 
 	NoFork = 0;
+	NumProcs = -1;
+	pthread_t thread1;
+	pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
+	int rc1;
 	parse_args(argc, argv);
 
 	bzero((char *)&sact, sizeof sact);
@@ -265,7 +270,11 @@
 		}
 
 		/* Jobs to be run (if any) are loaded; clear the queue. */
-		job_runqueue();
+		if ((rc1 = pthread_create(&thread1, NULL, job_runqueue, NULL))) {
+			Debug(DSCH, ("[%ld] thread failed\n", (long)getpid()));
+		}
+		/*job_runqueue();*/
+		pthread_join(thread1, NULL);
 
 		/* Check to see if we received a signal while running jobs. */
 		if (got_sighup) {
@@ -450,7 +459,7 @@
 parse_args(int argc, char *argv[]) {
 	int argch;
 
-	while (-1 != (argch = getopt(argc, argv, "npx:m:"))) {
+	while (-1 != (argch = getopt(argc, argv, "npx:m:q:"))) {
 		switch (argch) {
 		default:
 			usage();
@@ -467,6 +476,10 @@
 		case 'm':
 			strncpy(MailCmd, optarg, MAX_COMMAND);
 			break;
+		case 'q':
+			NumProcs = atoi(optarg);
+			NumProcs += 1;
+			break;
 		}
 	}
 }
diff -u vixie-cron-4.1-pristine2/globals.h vixie-cron-4.1-2/globals.h
--- vixie-cron-4.1-pristine2/globals.h	2009-06-15 22:47:10.000000000 -0600
+++ vixie-cron-4.1-2/globals.h	2009-06-15 22:51:58.000000000 -0600
@@ -67,6 +67,7 @@
 XTRN int        ValidateMailRcpts INIT(0);
 XTRN char       MailCmd[MAX_COMMAND] INIT("");
 XTRN char       cron_default_mail_charset[MAX_ENVSTR] INIT("");
+XTRN int       NumProcs INIT(0);
  
 #if DEBUGGING
 XTRN int	DebugFlags INIT(0);
diff -u vixie-cron-4.1-pristine2/job.c vixie-cron-4.1-2/job.c
--- vixie-cron-4.1-pristine2/job.c	2009-06-15 22:47:10.000000000 -0600
+++ vixie-cron-4.1-2/job.c	2009-06-15 22:54:33.000000000 -0600
@@ -24,6 +24,7 @@
 #endif
 
 #include "cron.h"
+#include <pthread.h>
 
 typedef	struct _job {
 	struct _job	*next;
@@ -61,13 +62,28 @@
 job_runqueue(void) {
 	job *j, *jn;
 	int run = 0;
+	int numRunning = 0;
+	WAIT_T waiter;
+	PID_T pid;
+	pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
 
+	Debug(DSCH, ("[%ld] thread number %ld\n", (long)getpid(), pthread_self()));
+	pthread_mutex_lock(&mutex1);
 	for (j = jhead; j; j = jn) {
+		numRunning += 1;
+		if (NumProcs != -1) {
+			if (numRunning >= NumProcs) {
+				while ((pid = wait(&waiter)) < OK && errno == EINTR)
+					;
+				numRunning -= 1;
+			}
+		}
 		do_command(j->e, j->u);
 		jn = j->next;
 		free(j);
 		run++;
 	}
 	jhead = jtail = NULL;
+	pthread_mutex_unlock(&mutex1);
 	return (run);
 }
diff -u vixie-cron-4.1-pristine2/Makefile vixie-cron-4.1-2/Makefile
--- vixie-cron-4.1-pristine2/Makefile	2009-06-15 22:47:10.000000000 -0600
+++ vixie-cron-4.1-2/Makefile	2009-06-15 22:54:53.000000000 -0600
@@ -89,7 +89,7 @@
 #INSTALL = installbsd
 INSTALL = install
 #<<any special load flags>>
-LDFLAGS		=	-g
+LDFLAGS		=	-g -lpthread
 #################################### end configurable stuff
 
 SHELL		=	/bin/sh
