Java线程启动其他线程,每个线程写入数组

标签 java arrays multithreading thread-sleep notify

对 Java 来说是完全陌生的,但是我必须以某种方式使其工作。我希望你们能让我走上正确的道路。

程序必须创建 N 个线程和一个包含 N 个元素的数组。第一个线程应将随机数写入数组(此处 - resultArray),调用(或创建)下一个线程(它将执行相同的操作)并 hibernate ,直到最后一个线程通知所有其他 hibernate 线程。

那么,到目前为止我做得正确吗?如何使 run() 访问演示的 resultArray 并写入线程的随机数? 另外,run() 如何到达(threadList 的)其他线程来通知它们?

谢谢。

public class gijos extends Thread {

    private int length; 
    private int position;

    public gijos(int arrPos) { 
      position = arrPos;
    } 

    public int getPosition(){
       return position;
    }

    public void run() {   
             Random rand = new Random();
             int  n = rand.nextInt(51) + 1;
    }
<小时/>
public class demo { 

    public static void main (String[] args) { 

            System.out.println("Array length / thread count:");

            Scanner s = new Scanner(System.in);
            int N = s.nextInt();

            int[] resultArray = new int[N];

            gijos[] threadList = new gijos[N]; 

            for(int i = 0; i < N; i++){
                threadList[i] = new gijos(i);
            } 

    }

}

最佳答案

这里有一个示例工作类:

public class ArrayWorker implements Runnable {
    private static final List<ArrayWorker> threadList = new LinkedList<>();
    private static final Random rnd = new Random(System.currentTimeMillis());

    private final int[] array;
    private final int index;


    public ArrayWorker(final int[] array, final int index) {
        if (index > array.length - 1) {
            throw new IndexOutOfBoundsException(String.format("%d", index - array.length));
        }

        this.array = array;
        this.index = index;
        System.out.println(this + " has been created");
    }


    @Override
    public void run() {
        System.out.println(this + " run()");
        this.array[this.index] = rnd.nextInt(100);

        if (index < array.length - 2) {
            final ArrayWorker worker = new ArrayWorker(array, index + 1);

            System.out.println(this + " has created: " + worker);
            new Thread(worker).start();

            threadList.add(this);
            try {
                synchronized (this) {
                    System.out.println(this + " is now waiting");
                    this.wait();
                    System.out.println(this + " got notified");
                }
            } catch (InterruptedException ex) {
                System.out.println("Error while waiting for termination");
                threadList.remove(this);
            }
        } else {
            threadList.forEach(worker -> {
                synchronized(worker) {
                    System.out.println(this + " notifying: " + worker);
                    worker.notify();
                }
            });
        }
    }

    @Override
    public String toString() {
        return "WorkerThread[" + index + "]";
    }  
}

用法如下:

public static void main(String[] args) {
    final int[] myArray = new int[10];

    System.out.println("MainThread creating first WorkerThread and awaiting termination of last WorkerThread");
    Thread t = new Thread(new ArrayWorker(myArray, 0));
    try {
        t.start();
        t.join();
    } catch (InterruptedException ex) {
        ex.printStackTrace();
        System.exit(-1);
    }

    System.out.println("Last WorkerThread finished");
    for (int i : myArray) {
        System.out.print(i + " ");
    }
    System.out.println();
}

示例输出:

MainThread creating first WorkerThread and awaiting termination of last WorkerThread
WorkerThread[0] has been created
WorkerThread[0] run()
WorkerThread[1] has been created
WorkerThread[0] has created: WorkerThread[1]
WorkerThread[1] run()
WorkerThread[0] is now waiting
WorkerThread[2] has been created
WorkerThread[1] has created: WorkerThread[2]
WorkerThread[1] is now waiting
WorkerThread[2] run()
WorkerThread[3] has been created
WorkerThread[2] has created: WorkerThread[3]
WorkerThread[2] is now waiting
WorkerThread[3] run()
WorkerThread[3] notifying: WorkerThread[2]
WorkerThread[3] notifying: WorkerThread[1]
WorkerThread[2] got notified
WorkerThread[3] notifying: WorkerThread[0]
WorkerThread[1] got notified
WorkerThread[0] got notified
Last WorkerThread finished
Results:
10 25 73 7 

关于Java线程启动其他线程,每个线程写入数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26537627/

相关文章:

C: `int a[10]` 是什么意思

c - 从另一个进程的线程 ID 获取线程句柄

java - iText5.1.0在文档中设置页眉和页脚

java - 验证方法体中是否使用了方法参数

java - JobLauncherCommandLineRunner 不会在作业完成时退出

javascript - 如何在格式化文本上使用 .split

java - 在 Java 中向 Firebase 中的特定主题发送通知

c - 如何检查字符串是否在 C 中的字符串数组中?

ruby - Nokogiri vs Goliath……或者,他们能相处融洽吗?

java - 在java中如何从线程中获取返回值?