繁体   English   中英

Java多线程打印奇数和偶数

[英]Java Multithreading Printing Odd and Even Number

我已经开始在 Java 中学习线程。 我写了一个代码来按顺序打印奇数和偶数。 但我得到的输出是两倍。 下面是我的代码。

ThreadBasic1.java:

public class ThreadBasic1 {

    public static void main(String[] args) {


       Thread t1 = new Thread(new ThreadImplementation1());
       Thread t2 = new Thread(new ThreadImplementation1());

       t1.start();
       t2.start();

    }
}

线程实现1.java:

public class ThreadImplementation1 implements Runnable {

    boolean isOdd= false;
    @Override
    public void run() {
        System.out.println("thread started :: Thread name :: " + Thread.currentThread());
        try {
           for(int i = 1 ; i < 10 ; i++) {
               if(i %2 ==0) {
                   printEven(i);
               }
               else {
                   printOdd(i);
               }
           }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }





    synchronized void printEven(int number)throws InterruptedException  {
        while(!isOdd){
            try {

                wait();

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Even:"+number);
        isOdd = false;
        notifyAll();
    }
    synchronized void printOdd(int number) throws InterruptedException {

        while (isOdd) {

            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println("Odd :"+number);

        isOdd = true;
        notifyAll();
    }

}

输出:

thread started :: Thread name :: Thread[Thread-1,5,main]
Odd :1
Even:2
Odd :3
Even:4
Odd :5
Even:6
Odd :7
Even:8
Odd :9
thread started :: Thread name :: Thread[Thread-0,5,main]
Odd :1
Even:2
Odd :3
Even:4
Odd :5
Even:6
Odd :7
Even:8
Odd :9

您的问题很简单:您有两个完全相同的线程:打印从 1 到 9 的数字。

通常,此类练习要求您为每个线程编写略有不同的代码。 一个线程打印奇数,另一个线程打印偶数。 然后两个线程都需要进入锁定步骤,​​以实现正确的 1 2 3 4 输出。 或者您有“一个”线程实现,但是您可以以某种方式配置该线程的行为。

因此,这里的答案是退后一步,重新考虑您的整个方法。 让两个线程做同样的事情是没有意义的。 那只是意味着你重复了一些行为。 相反,弄清楚如何对齐两种不同的行为。

当然,我不会为此提供代码:练习的全部意义在于将这些想法转化为代码。

您可以在这里使用余数的概念。

如果 number%2==1 则 Odd 将打印数字并递增它,否则将进入等待状态。 如果 number%2==0 那么 Even 将打印数字并增加它,否则将进入等待状态。 让我们在示例的帮助下进行检查。

创建一个名为“OddEvenRunnable”的类并实现 Runnable 接口。

class OddEvenRunnable implements Runnable {
    public int PRINT_NUMBERS_UPTO = 10;
    static int number = 1;
    int remainder;
    static Object lock = new Object();


    public OddEvenRunnable(int remainder) {
        this.remainder = remainder;
    }

    @Override
    public void run() {
        while (number < PRINT_NUMBERS_UPTO) {
            synchronized (lock) {
                while (number % 2 != remainder) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName() + " " + number);
                number++;
                lock.notifyAll();
            }
        }

    }
}

public class PrintOddEvenMain {

    public static void main(String[] args) {
        OddEvenRunnable oddRunnable = new OddEvenRunnable(1);
        OddEvenRunnable evenRunnable = new OddEvenRunnable(0);


        Thread t1 = new Thread(oddRunnable, "Odd");
        Thread t2 = new Thread(evenRunnable, "Even");

        t1.start();
        t2.start();
    }

}

理想情况下,您应该只运行 1 个线程来为您执行黑白偶数和奇数切换工作。

package com.samples;

public class ThreadBasic1 {
public static void main(String[] args) {
    Thread t1 = new Thread(new ThreadImplementation1());
    Thread t2 = new Thread(new ThreadImplementation1());

    t1.start();
    //t2.start();
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM