gpt4 book ai didi

java - 同步线程 - 作业

转载 作者:行者123 更新时间:2023-12-02 07:26:28 27 4
gpt4 key购买 nike

我需要运行一个名为ArrayHolder的java程序,它将运行两个线程ArrayHolder 将有一个 ArrayThreadSeven 会用 7 覆盖该 Array 的每个元素,并用 1 覆盖 ThreadOne 。执行后的结果应该是7,1,7,1,7,1,7,1等。我已经解决了这个问题,尽管我不喜欢我的解决方案,并希望你能提出更好的方法。

p.s:两个线程都必须写入所有索引。

public class ArrayHolder {

private int[] array = {1, 2, 3, 4, 5, 6, 4, 8, 9, 10};

public void writeInt(int pos, int num) {
array[pos] = num;
}

public static void main(String[] args) {
ArrayHolder holder = new ArrayHolder();
ThreadSeven seven = new ThreadSeven(holder, null);
Runnable one = new ThreadOne(holder, seven);
Thread thread1 = new Thread(seven);
Thread thread2 = new Thread(one);
seven.setThread(one);

thread1.start();
thread2.start();

holder.printArray();
}

private void printArray() {
for (int i = 0; i < 10; i++) {
System.out.println(array[i]);
}
}

public class ThreadSeven implements Runnable {
private ArrayHolder array;
private Runnable t;
private int flag=0;
@Override
public void run() {
for(int i=0;i<10;i++){
array.writeInt(i, 7);

flag=(flag+1)%2;
if (flag==0){
synchronized(t){
t.notify();
}
}else{
synchronized(this){
try {
this.wait();
} catch (InterruptedException ex) {
Logger.getLogger(ThreadSeven.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
}
public ThreadSeven (ArrayHolder ar,Runnable t){
array=ar;
this.t=t;
}
public void setThread(Runnable t){
this.t=t;
}
}

public class ThreadOne implements Runnable {

private ArrayHolder array;
private Runnable t;
private int flag = 0;

@Override
public void run() {
for (int i = 0; i < 10; i++) {
array.writeInt(i, 1);

flag = (flag + 1) % 2;
if (flag == 1) {
synchronized (t) {
t.notify();
}
} else {
synchronized (this) {
try {
this.wait();
} catch (InterruptedException ex) {
Logger.getLogger(ThreadSeven.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
}

public ThreadOne(ArrayHolder ar, Runnable t) {
array = ar;
this.t = t;
}

public void setThread(Runnable t) {
this.t = t;
}
}

最佳答案

ThreadSeven 和 ThreadOne 不需要是单独的类;看起来您只是复制/粘贴了代码,然后更改了 7在 writeInt 中写入 1 。相反,您可以参数化该值并将其传递到构造函数中。然后你会得到类似的东西:

public class ThreadWriter implements Runnable {
private final int numberToWrite;
// ...
public ThreadOne(ArrayHolder ar, Runnable t, int numberToWrite) {
array = ar;
this.t = t;
this.numberToWrite = numberToWrite;
}
// ...
}

另一点是两个线程都必须互相了解;这不能很好地扩展。假设对于你的下一个作业,你的老师说你必须处理三个写 1, 4, 7, 1, 4, 7, ... 的线程。 ;您必须更改 ThreadOne 的实现和ThreadSeven 。您现在可以制定的更好的解决方案是 ThreadWriter他们自己变得更笨,并在 ArrayHolder 中更多地管理他们的互动类(或使用中介 ThreadWriterManager 类)。

关于java - 同步线程 - 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13519560/

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