[英]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.