多线程java程序,可以交替打印偶数和奇数 [英] Multi threaded java program to print even and odd numbers alternatively
问题描述
我被要求在一次采访中写一个双线程的Java程序。在这个程序中,一个线程应该打印偶数,另一个线程应该交替打印奇数。
I was asked to write a two-threaded Java program in an interview. In this program one thread should print even numbers and the other thread should print odd numbers alternatively.
示例输出:
线程1:1
线程2:2
线程1:3
线程2:4
......等等
Thread2: 4 ... and so on
我编写了以下程序。一个类任务
,其中包含两种分别打印偶数和奇数的方法。从main方法,我创建了两个线程来调用这两个方法。面试官让我进一步改进,但我想不出任何进步。有没有更好的方法来编写相同的程序?
I wrote the following program. One class Task
which contains two methods to print even and odd numbers respectively. From main method, I created two threads to call these two methods. The interviewer asked me to improve it further, but I could not think of any improvement. Is there any better way to write the same program?
class Task
{
boolean flag;
public Task(boolean flag)
{
this.flag = flag;
}
public void printEven()
{
for( int i = 2; i <= 10; i+=2 )
{
synchronized (this)
{
try
{
while( !flag )
wait();
System.out.println(i);
flag = false;
notify();
}
catch (InterruptedException ex)
{
ex.printStackTrace();
}
}
}
}
public void printOdd()
{
for( int i = 1; i < 10; i+=2 )
{
synchronized (this)
{
try
{
while(flag )
wait();
System.out.println(i);
flag = true;
notify();
}
catch(InterruptedException ex)
{
ex.printStackTrace();
}
}
}
}
}
public class App {
public static void main(String [] args)
{
Task t = new Task(false);
Thread t1 = new Thread( new Runnable() {
public void run()
{
t.printOdd();
}
});
Thread t2 = new Thread( new Runnable() {
public void run()
{
t.printEven();
}
});
t1.start();
t2.start();
}
}
推荐答案
好,有很多选择。我可能会使用 SynchronousQueue
(我不喜欢低级等待
/ 通知
并尝试使用更高级别的并发原语。另外 printOdd
和 printEven
可以合并为单个方法,不需要额外的标志:
Well, there are many alternatives. I would probably use a SynchronousQueue
instead (I don't like low-level wait
/notify
and try to use higher-level concurrency primitives instead). Also printOdd
and printEven
could be merged into single method and no additional flags are necessary:
public class App {
static class OddEven implements Runnable {
private final SynchronousQueue<Integer> queue = new SynchronousQueue<>();
public void start() throws InterruptedException {
Thread oddThread = new Thread(this);
Thread evenThread = new Thread(this);
oddThread.start();
queue.put(1);
evenThread.start();
}
@Override
public void run() {
try {
while (true) {
int i = queue.take();
System.out.println(i + " (" + Thread.currentThread() + ")");
if (i == 10)
break;
queue.put(++i);
if (i == 10)
break;
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
public static void main(String[] args) throws InterruptedException {
new OddEven().start();
}
}
这篇关于多线程java程序,可以交替打印偶数和奇数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!