gpt4 book ai didi

java - 创建两个线程,一个显示奇数和其他偶数

转载 作者:IT老高 更新时间:2023-10-28 20:43:01 26 4
gpt4 key购买 nike

我正在尝试创建两个线程,一个线程显示0到10的偶数,一个线程显示1到11的奇数。下面的代码适合设计这个程序吗?

public class Mythread {

public static void main(String[] args) {
Runnable r = new Runnable1();
Thread t = new Thread(r);
t.start();
Runnable r2 = new Runnable2();
Thread t2 = new Thread(r2);
t2.start();
}
}

class Runnable2 implements Runnable{
public void run(){
for(int i=0;i<11;i++){
if(i%2 == 1)
System.out.println(i);
}
}
}

class Runnable1 implements Runnable{
public void run(){
for(int i=0;i<11;i++){
if(i%2 == 0)
System.out.println(i);
}
}
}

最佳答案

@aymeric 答案不会按自然顺序打印数字,但这段代码会。解释在最后。

public class Driver {
static Object lock = new Object();

public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
public void run() {

for (int itr = 1; itr < 51; itr = itr + 2) {
synchronized (lock) {
System.out.print(" " + itr);
try {
lock.notify();
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {

for (int itr = 2; itr < 51; itr = itr + 2) {
synchronized (lock) {
System.out.print(" " + itr);
try {
lock.notify();
if(itr==50)
break;
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
try {
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("\nPrinting over");
} catch (Exception e) {

}
}
}

为了实现这一点,上面两个线程的运行方法必须一个接一个地调用,即它们需要同步,我正在使用锁来实现。

代码的工作原理如下:t1.run 打印奇数并通知任何等待线程它将释放锁,然后进入等待状态。

此时t2.run被调用,它打印下一个偶数,通知其他线程它即将释放它持有的锁,然后进入等待状态。

这样一直持续到 t2.run() 中的 itr 达到 50,此时我们的目标已经达到,我们需要杀死这两个线程。

通过中断,我避免在 t2.run 中调用 lock.wait() 并且因此关闭了 t2 线程,控制现在将转到 t1.run,因为它正在等待获取锁;但是这里它的值将> 51,我们将退出它的run(),从而关闭线程。

如果t2.run()中没有使用break,虽然我们会在屏幕上看到数字1到50,但是两个线程会陷入死锁状态,继续处于等待状态。

关于java - 创建两个线程,一个显示奇数和其他偶数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13786083/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com