使用Java中的三个线程依次打印数字
时间:2020-01-09 10:35:35 来源:igfitidea点击:
这篇文章显示了如何使用Java编写程序以使用三个线程按顺序打印数字。如果有三个线程T1,T2,T3,则这些线程应按以下方式交替打印数字:
T11
T22
T33
T14
T25
T36
..
..
..
使用3个线程打印数字-Java程序
在程序中,为每个线程分配一个数字(分别为0、1和2)。在线程打印数字之前,将每个数字除以3,并且所分配的数字等于该除法其余部分的线程才有资格打印该数字。
例如
如果数字%3 == 0,则T1打印数字
如果数字%3 == 1,则T2打印数字
如果数字%3 == 2,则T3打印数字
该程序用于使用线程顺序打印数字,可以仅使用synced关键字编写,也可以使用wait,notify和notifyAll方法进行编写,以进行线程间通信。
使用3个线程和synced关键字打印数字
public class PrintNumbers { final static int MAX_NUMBERS = 10; public static void main(String[] args) { // shared object PrintNumbers obj = new PrintNumbers(); // Creating 3 threads Thread t1 = new Thread(new NumberRunnable(obj, 0), "T1"); Thread t2 = new Thread(new NumberRunnable(obj, 1), "T2"); Thread t3 = new Thread(new NumberRunnable(obj, 2), "T3"); t1.start(); t2.start(); t3.start(); } } class NumberRunnable implements Runnable{ PrintNumbers obj; int threadNumber; static int number = 0; NumberRunnable(PrintNumbers obj, int result){ this.obj = obj; this.threadNumber = result; } @Override public void run() { while (number < PrintNumbers.MAX_NUMBERS) { synchronized(obj) { // check again for (number < PrintNumbers.MAX_NUMBERS) otherwise one more number my be // printed by another thread if(number % 3 == threadNumber && number < PrintNumbers.MAX_NUMBERS){ System.out.println(Thread.currentThread().getName() + " - " + ++number); } } } } }
输出:
T1 - 1 T2 - 2 T3 - 3 T1 - 4 T2 - 5 T3 - 6 T1 - 7 T2 - 8 T3 - 9 T1 - 10
使用3个线程打印数字并等待通知
使用线程打印数字并等待通知的Java程序与上面的示例非常相似,不同之处在于现在有一个等待条件(while(number%3!= threadNumber))。除非分配的线程号不等于该数字除以3的余数,否则将使线程等待。
仅当分配的线程号等于除数线程的其余部分时,才会打印该数字并通知其他等待线程,以便其中一个可以进入同步块。
代码中的另一件有趣的事情是这种情况(数字<PrintNumbers.MAX_NUMBERS – 2)。为什么要检查少于所需数量的两个?这是因为无论如何,这三个线程都将运行循环,而对于值8本身,一个线程会将其递增到9,另一个将递增到10.
public class PrintNumbers { final static int MAX_NUMBERS = 10; public static void main(String[] args) { // shared object PrintNumbers obj = new PrintNumbers(); // Creating 3 threads Thread t1 = new Thread(new NumberRunnable(obj, 0), "T1"); Thread t2 = new Thread(new NumberRunnable(obj, 1), "T2"); Thread t3 = new Thread(new NumberRunnable(obj, 2), "T3"); t1.start(); t2.start(); t3.start(); } } class NumberRunnable implements Runnable{ PrintNumbers obj; int threadNumber; static volatile int number = 0; NumberRunnable(PrintNumbers obj, int result){ this.obj = obj; this.threadNumber = result; } @Override public void run() { synchronized(obj) { while (number < PrintNumbers.MAX_NUMBERS - 2) { while(number % 3 != threadNumber){ try { obj.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + " - " + ++number); obj.notifyAll(); } } } }
输出:
T1 - 1 T2 - 2 T3 - 3 T1 - 4 T2 - 5 T3 - 6 T1 - 7 T2 - 8 T3 - 9 T1 - 10