java - super.run() 调用后,Thread 类中的控制不会返回

标签 java multithreading threadpoolexecutor

我有一个 threadfactory、执行器、线程类和一个可运行类。 这是线程类:(threadsCount 是一个 AtomicInteger,我用它来跟踪创建的线程数)

public void run() {
    try {
        threadsCount.incrementAndGet();
        super.run();
    } finally {
        threadsCount.decrementAndGet();
    }
}

我的可运行类当前尚未实现,但有空的 run() 方法。

当我尝试调用 Executor.execute(new RunnableClazz()) 时,控制权转到这个 Thread 类 - run() 方法,当它遇到 super.run() 时,它转到 RunnableClazz#run() 方法。

这些都很好。但问题是,在 RunnableClazz#run() 完成后,控制不会返回到 Thread 类的“finally” block 。

有什么想法吗?我是否需要在 run() 方法末尾手动终止可运行对象?

public class ThreadAA extends Thread {

private static final AtomicInteger threadsCount = new AtomicInteger();
private static final AtomicInteger threadsCreated = new AtomicInteger();
public static final String DEFAULT_NAME = "ThreadAA";

public ThreadAA(Runnable r)
    {
        this(r, DEFAULT_NAME);
    }
public ThreadAA(Runnable r, String threadName)
    {
        super(r, threadName + "-" + threadsCreated.incrementAndGet());

        setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
        {
            public void uncaughtException(Thread t, Throwable e)
            {
                logger.error("Uncaught exception in thread " + t.getName(), e);
            }
        });
    }

@Override
public void run()
    {
        boolean debug = false;
        //just for debug purpose
        debug = true;
        if(debug)
        {
            logger.debug("Running thread " + getName());
        }

        try
        {
            threadsCount.incrementAndGet();
            super.run();
        }
        finally
        {
            threadsCount.decrementAndGet();
            if(debug)
            {
                logger.debug("Done running thread " + getName());
            }
        }
    }

 }

我的RunnableClass:

public class RunnableClazz implements Runnable {

@Override
public void run() {
        logger.debug("Inside RunnableClazz");
}

}

调用此可运行的方法如下所示:

  Executor executor = new Executor(25, 100, 1L, TimeUnit.SECONDS, 
                new ArrayBlockingQueue<Runnable>(5), new TFactory("abc"));

    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());        
    executor.execute(new RunnableClazz());  

executor.execute(new RunnableClazz());

请注意,我在服务器启动期间只创建了一次执行器。我粘贴它只是为了提供有关如何创建它的想法。 因此 executor.execute(new RunnableClazz()); 会产生问题。

最佳答案

我复制了您的代码并开始调试。

当你调用 super.run() 时,它会运行 ThreadPoolExecutor 中的一个:

    public void run() {
        runWorker(this);
    }

runWorker 然后调用 RunnableClazz.run(),完成后,它会暂停线程,等待新的 runnable 被执行。这是怎么发生的?

在 threadFactory 中,我认为它是这样的:

public Thread newThread(Runnable r) {
    return new ThreadAA(r);
}

Runnable r 不是您的 RunnableClazz,而是 ThreadPoolExecutor。

编辑:

您可能想要扩展 ThreadPoolExecutor 类并实现方法:

protected void beforeExecute(Thread t, Runnable r) { }

protected void afterExecute(Runnable r, Throwable t) { }

并在那里实现计数。

关于java - super.run() 调用后,Thread 类中的控制不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16109919/

相关文章:

java - 如何在 Android 中获取表格布局的内容

java - 使用 bean 的属性作为参数进行重定向

java - Java中什么情况下需要同步数组?

c# - 太多任务导致 SQL 数据库超时

multithreading - Jackrabbit 和并发修改

python-3.x - concurrent.futures.ProcessPoolExecutor() 的 Python : Get multiple return values and provide multiple arguments in executor. 映射

Java 1.8 和 tomcat 6.0.53 由 : java. io.EOFException 引起:SSL 对等点错误关闭

c++ - 调用远程设置 EAX 和 ECX 的函数

java - ThreadPoolExecutor future 任务-Spring bean注入(inject)异常-spring-beans-2.0

java - 通过重写 afterExecute(Runnable r, Throwable t) 可重试线程池