相关疑难解决方法(0)

ThreadPoolExecutor中的死锁

当所有线程都在func 中等待时,遇到ThreadPoolExecutor停在execute(Runnable)函数中的情况,workQueue为空.ThreadPoolgetTask

有人有什么想法吗?

ThreadPoolExecutor与创建ArrayBlockingQueue,和corePoolSize == maximumPoolSize = 4

[编辑]更准确地说,线程在ThreadPoolExecutor.exec(Runnable command)func中被阻止.它有执行任务,但没有执行.

[Edit2]执行程序被阻塞在工作队列(ArrayBlockingQueue)内的某处.

[Edit3] callstack:

thread = front_end(224)
at sun.misc.Unsafe.park(Native methord)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:747)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:778)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1114)
at
java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:186)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)
at java.util.concurrent.ArrayBlockingQueue.offer(ArrayBlockingQueue.java:224)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:653)
at net.listenThread.WorkersPool.execute(WorkersPool.java:45)
Run Code Online (Sandbox Code Playgroud)

同时workQueue为空(使用远程调试检查)

[Edit4]代码使用ThreadPoolExecutor:

public WorkersPool(int size) {
  pool = new ThreadPoolExecutor(size, size, IDLE_WORKER_THREAD_TIMEOUT, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(WORK_QUEUE_CAPACITY),
      new ThreadFactory() {
        @NotNull
        private final AtomicInteger threadsCount = new AtomicInteger(0); …
Run Code Online (Sandbox Code Playgroud)

java concurrency

13
推荐指数
2
解决办法
3万
查看次数

为什么我的SwingWorker线程即使完成执行也会继续运行?

我正在为控制台应用程序实现GUI,我需要在指定的时间间隔内执行一些操作(例如,解析XML文件).我决定使用javax.swing.Timer和SwingWorker来确保这些操作不会使我的应用程序无响应.

我用这种方式实现了计时器:

public class DataUpdateTimer extends Timer {

    private String dataFlowControllerXML = null;
    private DataUpdateWorker dataUpdateWorker = null;

    public class DataUpdateWorker extends SwingWorker {

        private String dataFlowControllerXML = null;

        DataUpdateWorker(String dataFlowControllerXML) {
            super();
            this.dataFlowControllerXML = dataFlowControllerXML;
        }

        @Override
        protected Boolean doInBackground() throws Exception {

            Thread.sleep(300);
            return Boolean.TRUE;
        }

    }

    public class DataUpdateIntervalListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            DataUpdateTimer timer = (DataUpdateTimer)e.getSource();
            DataUpdateWorker dataUpdateWorker = timer.getDataUpdateWorker();

            if (dataUpdateWorker != null)
                if (dataUpdateWorker.isDone()) {
                    Boolean updateResult = Boolean.FALSE;
                    try …
Run Code Online (Sandbox Code Playgroud)

java swingworker

11
推荐指数
1
解决办法
4708
查看次数

为什么jProfiler将Unsafe.park/unpark显示为使用CPU周期?

我们使用相当多的ExecutorServices运行服务.

在使用jProfiler 7.1(sampling,Runnable)分析服务时,我们可以看到sun.misc.Unsafe.park + unpark当前是使用热点中大部分CPU时间的调用.

http://i.stack.imgur.com/wT2Cj.jpg

这令人费解.

Park和unpark应该是阻塞的,因此不使用任何CPU周期(或至少少量).这是来自jprofiler的某种错误(即没有检测到它,因为它在sun.misc包中吗?)或者我们使用ExecutorService框架实际上有什么问题吗?

java multithreading sun jprofiler

5
推荐指数
1
解决办法
1380
查看次数

标签 统计

java ×3

concurrency ×1

jprofiler ×1

multithreading ×1

sun ×1

swingworker ×1