Java 如何停止线程交互?
JAVA线程初学者,我有两个线程都在从1到20计数,一个线程在打印偶数。另一个线程在打印奇数。一个接一个并发地像奇数-1偶数-2奇数-3偶数-4。。。奇数-17偶数-18奇数-19使用线程间通信(在同一实例上使用wait和notify方法) 这部分执行得很好。但在计数结束时,其中一个线程处于等待状态,另一个线程被终止 那么如何解决这个问题呢?我应该用什么样的方法来解决这个问题 代码:Java 如何停止线程交互?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,JAVA线程初学者,我有两个线程都在从1到20计数,一个线程在打印偶数。另一个线程在打印奇数。一个接一个并发地像奇数-1偶数-2奇数-3偶数-4。。。奇数-17偶数-18奇数-19使用线程间通信(在同一实例上使用wait和notify方法) 这部分执行得很好。但在计数结束时,其中一个线程处于等待状态,另一个线程被终止 那么如何解决这个问题呢?我应该用什么样的方法来解决这个问题 代码: public class OddEvenNumbers { static A a= new A();
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();
}
}
}
}
}
公共类编号{
静态A=新A();
公共静态void main(字符串[]args){
OddNumbers奇数=新的OddNumbers();
偶数=新的偶数();
螺纹th1=新螺纹(奇数);
螺纹th2=新螺纹(偶数);
th1.start();
试一试{
睡眠(1);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
th2.start();
}
}
公共类实现可运行{
@凌驾
公开募捐{
//TODO自动生成的方法存根
对于(int i=1;i删除最后一个wait()调用(当计数器等于20时),这样,最后一个打印线程就不会等待而没有机会得到notify().你能分享你的代码吗?如果两个线程中的一个总是在等待另一个线程,那么使用不同的线程是没有意义的。你只是在同步上浪费了很多时间。如果你遇到了允许并行处理的问题,也许使用a会有所帮助。@fabian,这是一个非常常见的家庭作业练习。你是对的,它会在一个真实的程序中做这件事是很愚蠢的,但它教会了他们同步线程的基本知识。谢谢你的评论。但这是一个简单的例子,我这样做是为了理解等待和通知的概念。它帮助我解决了问题。但是处理等待和通知是正确的方法,还是我们需要其他方法或预定义的类想一想,对于这个简单的任务,这是一个合适的简单方法——还有一些其他的工具(例如信号量),但是它们可能有点太多了。