gpt4 book ai didi

java - 如何调度作用于单个对象的三个线程?

转载 作者:行者123 更新时间:2023-12-01 04:26:04 24 4
gpt4 key购买 nike


我有一个要求,3 个线程作用于一个单一对象,该对象具有三个方法,每个线程都有一个方法,例如..

t1---> object.printOne(int number).
t2---> object.printTwo(int number).
t3---> object.printThree(int number).

现在我想让这些线程同步,并且对象访问的顺序应该像

t1 打印....值
t2 打印....值
t3 打印....值
t1 打印....值
t2 打印....值
t3 打印....值
t1 打印....值
t2 打印....值
t3 打印....值
....等等..

我有以下代码..
建议我任何技术

One.java

public class One extends Thread {

PrintNumbers p;
int i = 1;

public One(PrintNumbers p) {
this.p = p;
}

@Override
public void run() {

int prev = 1;
while (prev < 1111) {
p.printOne(prev);
prev = (int) (prev + Math.pow(10, i));
i = i + 1;
}

}
}

两个.java

public class Two extends Thread {

int i = 1;

PrintNumbers p;

public Two(PrintNumbers p) {
this.p = p;

}

@Override
public void run() {

int prev = 2;
while (prev < 2222) {
p.printTwo(prev);
prev = (int) (prev + 2 * Math.pow(10, i));
i = i + 1;
}

}
}

三.java

public class Three extends Thread {

PrintNumbers p;
int i = 1;

public Three(PrintNumbers p) {
this.p = p;
}

@Override
public void run() {

int prev = 3;
while (prev < 3333) {
p.printThree(prev);
prev = (int) (prev + 3 * Math.pow(10, i));
i = i + 1;
}

}
}

PrintNumbers.java

import java.util.logging.Level;
import java.util.logging.Logger;

public class PrintNumbers {

public enum status {
A, B, C
}

status X = status.A;
//
public synchronized void printOne(int number) {
//
if (!X.equals(status.A) && !Y.equals(status.B)) {

try {
wait();

} catch (InterruptedException ex) {
Logger.getLogger(PrintNumbers.class.getName()).log(
Level.SEVERE, null, ex);
}
}
System.out.println(Thread.currentThread().getName() + number);
X = status.B;

notifyAll();

}

public synchronized void printTwo(int number) {
//
if (!X.equals(status.B) && !Y.equals(status.C)) {

try {
// System.out.println("under wait even");
wait();
} catch (InterruptedException ex) {
Logger.getLogger(PrintNumbers.class.getName()).log(
Level.SEVERE, null, ex);
}
}
System.out.println(Thread.currentThread().getName() + number);
X = status.C;

notifyAll();

}

public synchronized void printThree(int number) {
//
if (!X.equals(status.C) && !Y.equals(status.A)) {

try {
// System.out.println("under wait even");
wait();
} catch (InterruptedException ex) {
Logger.getLogger(PrintNumbers.class.getName()).log(
Level.SEVERE, null, ex);
}
}
System.out.println(Thread.currentThread().getName() + number);
X = status.A;


notifyAll();

}
//
}

PrintTest.java

public class PrintTest {

public static void main(String[] args) {

PrintNumbers b = new PrintNumbers();

One firstThread = new One(b);
Two secondThread = new Two(b);
Three thirdThread = new Three(b);

secondThread.setName("second: ");
thirdThread.setName("third: ");
firstThread.setName("first: ");

firstThread.start();
secondThread.start();
thirdThread.start();
}
}

o/p:
第一:1
第二个:2
第三:3
第一:11
第二:22
第三名:33
第一:111
第二:222
第三:333
...等等

最佳答案

PrintNumbers 类中的 if block 更改为 while 以获得所需的行为

if (!X.equals(status.A) && !Y.equals(status.B))

while (!X.equals(status.A))

同时删除未使用的 Y 条件。

关于java - 如何调度作用于单个对象的三个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18481945/

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