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

标签 java multithreading

我正在尝试创建两个线程,一个线程显示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/

相关文章:

java - mac设置环境变量

java - 将 Runnable 实现为接口(interface)的抽象类

java - 当我输入下载链接URL时,如何让chrome F12开发者工具记录网络?

java - 从基类设置派生类成员

java - JNDI 使用 ADS 将用户添加到组

c# - 跨线程操作无效

c - 使用c中的线程对矩阵中的元素求和

linux - 用户线程和内核线程如何与 Linux 堆栈一起工作?

c# - 关于 C# 委托(delegate)的一个问题

java - 使 "Programming in Scala"junit 示例在 IntelliJ 中工作时出现问题