在Java中使用3个线程打印序列

时间:2020-02-23 14:34:37  来源:igfitidea点击:

在本教程中,我们将看到如何在java中使用3个线程打印序列。
它类似于使用Java中的两个线程打印奇数偶数。

问题

你有3个线程。
我们需要使用这3个线程打印序列。
我们需要以自然顺序打印到最大。

例如:假设我们有3个线程。
T1,T2和T3.
如果最大值为10,则需要打印:

T1 1
T2 2
T3 3
T1 4
T2 5
T3 6
T1 7
T2 8
T3 9
T1 10

解决方案

我们将在这里使用余数的概念。

  • 如果Number%3 == 1那么T1将打印它将进入等待状态的数字和递增。
  • 如果Number%3 == 2那么T2将打印该号码并递增,所以它将进入等待状态。
  • 如果Number%3 == 0那么T3将打印该号码并递增,所以它将进入等待状态。

让我为此提供简单的程序。
让我们创建一个名为"printsequencerunnable"的类,它将实现Runnable接口。

public class PrintSequenceRunnable implements Runnable{
 
	public int PRINT_NUMBERS_UPTO=10;
	static int  number=1;
	int remainder;
	static Object lock=new Object();
 
	PrintSequenceRunnable(int remainder)
	{
		this.remainder=remainder;
	}
 
	@Override
	public void run() {
		while (number < PRINT_NUMBERS_UPTO-1) {
			synchronized (lock) {
				while (number % 3 != remainder) { //wait for numbers other than remainder
					try {
						lock.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				System.out.println(Thread.currentThread().getName() + " " + number);
				number++;
				lock.notifyAll();
			}
		}
	}
}

让我们创建一个名为"printthreadsseequentiallymain"的类,这将实现可逃的接口。

public class PrintThreadsSequentiallyMain {
 
	public static void main(String[] args) {
		
		PrintSequenceRunnable runnable1=new PrintSequenceRunnable(1);
		PrintSequenceRunnable runnable2=new PrintSequenceRunnable(2);
		PrintSequenceRunnable runnable3=new PrintSequenceRunnable(0);
		
		Thread t1=new Thread(runnable1,"T1");
		Thread t2=new Thread(runnable2,"T2");
		Thread t3=new Thread(runnable3,"T3");
		
		t1.start();
		t2.start();
		t3.start();	  
	}
}

运行上面的程序时,我们将得到以下输出。

T1 1
T2 2
T3 3
T1 4
T2 5
T3 6
T1 7
T2 8
T3 9
T1 10