这个线程案例该怎么敲?

怎么把线程分别分配给每段数据打印输出?
又怎么保证不重复数字?

img

预先将这20分为五组,每个线程各自打印各自的数。

代码如下:




public class MyThread implements Runnable {

    public int[] nums;
    public int count;

    public MyThread(int[] nums, int count) {
        this.nums = nums;
        this.count = count;
    }

    public static void main(String[] args) {
        int n = 20;
        int m = 5;
        int size = n / m;

        int[][] totalNums = new int[m][size];

        for (int i = 0; i < n; i++) {
            totalNums[i / size][i % size] = i+1;
        }

        Thread[] threads = new Thread[m];
        for (int i = 0; i < m; i++) {
            int[] mums = totalNums[i];
            MyThread myThread = new MyThread(mums, i + 1);
            threads[i] = new Thread(myThread);
        }
        for (int i = 0; i < m; i++) {
            threads[i].start();
        }

    }

    @Override
    public void run() {
        for (int num : nums) {
            System.out.println("第" + count + "个线程:" + num);
        }
    }
}

要将线程分别分配给每个数字进行打印输出,可以使用线程池来管理线程。线程池可以预先创建一定数量的线程,并将任务队列中的任务分配给这些线程进行处理。

为了保证不重复打印数字,可以在每个线程的任务中加入一个判断,如果该数字已经被打印过了,则跳过该任务。具体实现可以参考以下代码:

import threading  
  
# 定义线程池类  
class ThreadPool:  
    def __init__(self, pool_size):  
        self.pool = []  
        for i in range(pool_size):  
            t = threading.Thread(target=self.worker)  
            self.pool.append(t)  
            t.start()  
  
    def worker(self):  
        while True:  
            task = self.task_queue.get()  
            if task is None:  
                break  
            # 处理任务  
            print(task)  
  
    def add_task(self, task):  
        self.task_queue.put(task)  
  
# 创建线程池,并添加任务  
pool_size = 5  
tp = ThreadPool(pool_size)  
tasks = []  
for i in range(20):  
    tasks.append(i+1)  
for i in range(0, len(tasks), pool_size):  
    tp.add_task(tasks[i:i+pool_size])  
  
# 等待所有线程完成任务  
tp.add_task(None)  
while True:  
    if tp.task_queue.empty():  
        break