Java 线程池实现-我做得对吗?

Java 线程池实现-我做得对吗?,java,multithreading,threadpool,Java,Multithreading,Threadpool,我是多线程新手。 我很难理解我的实现有什么问题,以及为什么我看到的每个实现都使用同步块和NOTIFY。 运行似乎还可以,所以我不能指出什么不好,但我假设有一些多线程的原则我没有遵循 代码如下: public class Threads { static Queue<MyThread> queue = new LinkedList<>(); static Thread[] threadsArr = new Thread[10]; public static void ma

我是多线程新手。 我很难理解我的实现有什么问题,以及为什么我看到的每个实现都使用同步块和NOTIFY。 运行似乎还可以,所以我不能指出什么不好,但我假设有一些多线程的原则我没有遵循

代码如下:

public class Threads {
static Queue<MyThread> queue = new LinkedList<>();
static Thread[] threadsArr = new Thread[10];

public static void main(String[] args) throws InterruptedException {
    Threads t = new Threads();
    t.startArr();
    t.startProcess();
}
void startArr(){
    for (int i=0;i<10;i++){
        threadsArr[i] = new Thread(new MyThread(i));
    }
}
void startProcess(){

    for (int i=0;i<100;i++){
        queue.add(new MyThread(i));
    }
    for (int i=0;i<100;i++){
        int insertPlace = 0;
        boolean isFull = true;
        while (isFull){
            for (int j=0;j<10;j++){
                if (!threadsArr[j].isAlive()){
                    insertPlace = j;
                    isFull = false;
                }
            }
        }
        threadsArr[insertPlace] = new Thread(new MyThread(i));
        threadsArr[insertPlace].start();
    }
}
}


谢谢。

我认为主要的问题是您错过了“ThreadPoolExecutor”的角色。基本上,使用您的类的用户希望能够调用“execute(Runnable run)”方法,知道您的Threads类将在允许创建的进程中处理执行。 您应该重新编写类的API并提供这种方法(例如,请参阅RealThreadPoolExecutor)

第二,如果你正在接受面试培训,那么不要在全班都使用像“10”这样的常量,试着编写更干净、更灵活的代码。这应该是类的用户(在构造函数中)提供的一个属性,指定他希望一次允许多少线程(再次查看真正的ThreadPoolExecutor)

<> P>最后,我没有实现TracePoLeExcel的专家,但可以考虑使用BuffigQueWin(),它支持我引用的“等待队列在检索元素时变成非空的操作”。这对于等待线程可用,而不是自己执行线程可能很有用。但我想有更好的答案

祝你好运


Mathias

为什么要编写自己的线程池?Java已经有了一个坏主意,如果你不真正理解线程,那么写一个线程池是不好的。所以我在为下一次面试做准备。我还试图了解多线程的基础知识。代码中的主要问题是它不是线程池。作为一个客户端,当我不再需要线程时,如何利用池中的线程并将其返回给它?
public class MyThread implements Runnable {
int threadNumber;
public MyThread(int threadNumber){
    this.threadNumber = threadNumber;
}

@Override
public void run() {
    System.out.println(threadNumber + " started.");
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(threadNumber + " finished.");

}