gpt4 book ai didi

java - 是否可以通过在 run() 方法中调用 run() 来启动线程?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:46:44 33 4
gpt4 key购买 nike

我知道不应该调用 run 方法来启动新线程执行,但我指的是 this article他们在另一个 run 方法中调用了 runnable.run(); ,这似乎暗示它启动了一个新线程或者根本没有creating/strong> 线程,它只是创建一个新线程并在同一线程中运行所有可运行的线程,即逐个任务?

这是文章提到的代码。

 public class ThreadPool {

private BlockingQueue taskQueue = null;
private List<PoolThread> threads = new ArrayList<PoolThread>();
private boolean isStopped = false;

public ThreadPool(int noOfThreads, int maxNoOfTasks){
taskQueue = new BlockingQueue(maxNoOfTasks);

for(int i=0; i<noOfThreads; i++){
threads.add(new PoolThread(taskQueue));
}
for(PoolThread thread : threads){
thread.start();
}
}

public synchronized void execute(Runnable task) throws Exception{
if(this.isStopped) throw
new IllegalStateException("ThreadPool is stopped");

this.taskQueue.enqueue(task);
}

public synchronized void stop(){
this.isStopped = true;
for(PoolThread thread : threads){
thread.doStop();
}
}

}

public class PoolThread extends Thread {

private BlockingQueue taskQueue = null;
private boolean isStopped = false;

public PoolThread(BlockingQueue queue){
taskQueue = queue;
}

public void run(){
while(!isStopped()){
try{
Runnable runnable = (Runnable) taskQueue.dequeue();
runnable.run();
} catch(Exception e){
//log or otherwise report exception,
//but keep pool thread alive.
}
}
}

public synchronized void doStop(){
isStopped = true;
this.interrupt(); //break pool thread out of dequeue() call.
}

public synchronized boolean isStopped(){
return isStopped;
}
}

问题:

  1. 为什么 thread.start(); 在构造函数中被调用?

  2. 如果 thread.start(); 之前被调用,我如何查询我的任务调用 this.taskQueue.enqueue(task);

  3. 要了解所有这些,请为该示例发布一个驱动程序类maxNoOfTasks=10noOfThreads=3。输出为 同样,我们将不胜感激。

  4. run 方法中的 Runnable.run() 是否启动一个新线程?

谢谢

最佳答案

i was referring this article where they have called runnable.run(); inside another run method and it seems to be implying that it starts a new thread.

查看代码,我根本看不出这种含义。

这不是开始一个新线程。它正在当前池线程上的队列中运行下一个 Runnable

I know that run method should not be called to start a new thread execution...

不是不应该不能。 :-) 调用 run 只是在当前线程上调用 run,就像任何其他方法调用一样。

  1. Why thread.start(); is called inside constructor?

启动刚刚使用 new PoolThread(taskQueue) 创建的线程。

  1. How do i enque my task if thread.start(); is called even before calling this.taskQueue.enqueue(task);

您将它传递给execute。它被添加到待办事项队列中 (taskQueue)。 ThreadPool 创建的 PoolThread 之一将在下次空闲时获取它。

  1. To understand all these please post a driver class for this example with maxNoOfTasks=10 and noOfThreads=3.and output for the same would be much appreciated.

我不知道你所说的驱动类是什么意思,但我认为回答问题就足够了。

  1. Does Runnable.run() inside run method start a new thread ?

没有。


为了理解它的作用,假设您创建了一个具有 5 个线程的 ThreadPoolThreadPool 构造函数立即创建并启动五个 PoolThread 线程。这些线程不断检查 taskQueue 以查看是否有任何事情要做,如果有,他们就会去做。

当然,最初,taskQueue 始终为空,因此线程忙于等待,不断旋转检查 taskQueue 中的内容。 (这不是很理想,它无缘无故地消耗 CPU。最好在无事可做时暂停线程,但这已经开始与实际问题相去甚远了。)

然后,在某个时刻,您调用execute 并传入一个任务。这会将其添加到 taskQueue。下一次五个线程中的一个检查 taskQueue 中的内容时,它会找到并在该线程(不是新线程)上运行它。

关于java - 是否可以通过在 run() 方法中调用 run() 来启动线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50582818/

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