Vik*_*gar 6 java multithreading thread-synchronization
这是我在求职面试中提出的一个问题:
你有两个不同的类(实现Runnable)说EvenThread和OddThread.顾名思义,EvenThread只打印偶数,奇数线程只打印奇数,考虑范围为0-100.
class EvenThread implements Runnable {
@Override
public void run() {
for (int i = 0; i <= 10; i += 2) {
System.out.println(i);
}
}
}
class OddThread implements Runnable {
@Override
public void run() {
for (int i = 1; i < 10; i += 2) {
System.out.println(i);
}
}
}
public class EvenOdd {
public static void main(String args[]) {
Thread tEven = new Thread(new EvenThread());
Thread tOdd = new Thread(new OddThread());
tEven.start();
tOdd.start();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们需要以这样的方式强制执行机制:数字按顺序打印(即0,1,2,3,4 ......等等).
我在Stack Overflow中看到了很多类似的问题,但它们只有一个类来打印数字,并且在其中调用了2个同步方法.
任何专家都可以建议吗?
这是一个带有低级等待/通知机制的丑陋示例:
public class Main {
static boolean turn = false; // false is even, true is odd
public static void main(String[] args) {
Object o = new Object();
Thread tEven = new Thread(new EvenThread(o));
Thread tOdd = new Thread(new OddThread(o));
tEven.start();
tOdd.start();
}
// TODO some inheritance with [Even/Odd]Thread
static class EvenThread implements Runnable {
Object o;
EvenThread(Object o) {
this.o = o;
}
@Override
public void run() {
for (int i = 0; i <= 10; i += 2) {
synchronized (o) {
try {
while (turn) {
o.wait();
}
}
catch (InterruptedException ie) {
ie.printStackTrace();
}
finally {
System.out.println(i);
turn = !turn;
o.notifyAll();
}
}
}
}
}
static class OddThread implements Runnable {
Object o;
OddThread(Object o) {
this.o = o;
}
@Override
public void run() {
for (int i = 1; i < 10; i += 2) {
synchronized (o) {
try {
while (!turn) {
o.wait();
}
}
catch (InterruptedException ie) {
ie.printStackTrace();
}
finally {
System.out.println(i);
turn = !turn;
o.notifyAll();
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出
0
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1446 次 |
| 最近记录: |