【发布时间】:2015-12-19 16:42:59
【问题描述】:
JAVA 线程初学者,我有两个线程都从 1 数到 20 并且一个线程正在打印甚至没有。其他线程正在打印奇数。一个接一个地同时像奇数1偶数2奇数3偶数4...奇数17偶数-18奇数19使用线程间通信(在同一实例上使用等待和通知方法)。
这部分执行得很好。但在计数结束时,任何一个线程都处于等待状态,而其他线程正在终止。
那么如何摆脱这个问题呢?我应该使用什么方法来解决这个问题?
代码:
public class OddEvenNumbers {
static A a= new A();
public static void main(String[] args) {
OddNumbers odd = new OddNumbers();
EvenNumbers even = new EvenNumbers();
Thread th1 = new Thread(odd);
Thread th2 = new Thread(even);
th1.start();
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
th2.start();
}
}
public class EvenNumbers implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=1;i<20;i++)
{
synchronized (OddEvenNumbers.a) {
if(i%2==0)
{
System.out.println("Even Numbers : "+i);
}
try {
OddEvenNumbers.a.notify();
OddEvenNumbers.a.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public class OddNumbers implements Runnable {
public void run() {
System.out.println("In ODD run Method");
for(int i=1;i<20;i++)
{
synchronized (OddEvenNumbers.a) {
if(i%2!=0)
{
System.out.println("ODD Number "+i);
}
try {
OddEvenNumbers.a.wait();
OddEvenNumbers.a.notify();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
【问题讨论】:
-
你能分享你的代码吗?
-
如果两个线程中的一个总是在等待另一个线程,那么使用不同的线程是没有意义的。你只是在同步上浪费了很多时间。如果您遇到确实允许并行处理的问题,也许使用
ExecutorService会有所帮助。 -
@fabian,这是一个非常常见的家庭作业。你是对的,在真正的程序中这样做是一件愚蠢的事情,但它教会了他们同步线程的基础知识。
-
感谢您的 cmets。但这是我为理解等待和通知概念所做的一个简单示例。
标签: java multithreading thread-safety