Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程倒计时_Java_Multithreading - Fatal编程技术网

Java线程倒计时

Java线程倒计时,java,multithreading,Java,Multithreading,这个java应用程序将启动三个线程并倒计时一个数字。一旦计数器达到零,线程将完成并退出。不幸的是,计数器将绕过零检查。如何修复它 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public clas

这个java应用程序将启动三个线程并倒计时一个数字。一旦计数器达到零,线程将完成并退出。不幸的是,计数器将绕过零检查。如何修复它

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadTest {
    volatile Long totalMsg = 100L;
    final Lock maxLimitLock = new ReentrantLock();

    public void start() {
        int threadNumber = 3;
        ExecutorService executor = Executors.newFixedThreadPool(threadNumber);
        for (int i = 0; i < threadNumber; i++) {
            executor.submit(new ThreadTest.ConsumerThread(i));
        }      
    }
    class ConsumerThread implements Runnable {
        private int threadNumber;
        public ConsumerThread(int threadNumber) {
            this.threadNumber = threadNumber;
        }
        public void run() {
            while (true) {
                try {
                    maxLimitLock.lock();
                    totalMsg--;
                    System.out.println(totalMsg + " left");
                    if (totalMsg == 0) {
                        System.out.println("finished all of " + totalMsg);
                        break;
                    }
                } finally {
                    maxLimitLock.unlock();
                }
            }
            System.out.println("thread " + this.threadNumber + " finished");
        }
    }
    public static void main(String[] args) throws Exception {
        ThreadTest reader = new ThreadTest();
        reader.start();
    }
}
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.locks.Lock;
导入java.util.concurrent.locks.ReentrantLock;
公共类线程测试{
挥发性长时间总MSG=100L;
最终锁maxLimitLock=新的ReentrantLock();
公开作废开始(){
int threadNumber=3;
ExecutorService executor=Executors.newFixedThreadPool(线程编号);
对于(int i=0;i

谢谢。

代码中的问题就在这里

totalMsg--;
...
if (totalMsg == 0) {
您的代码总是递减计数器,这样只有一个线程可以被释放,后续线程的计数器将小于0,因此它们永远不会被释放,所以您应该将其替换为

if (totalMsg <= 0) {

<强> Nb:< /强>考虑为您的计数器使用<代码> AtomicLong <代码> .E/P>将ESH更改为ToeMsgg>0,并执行在循环外的IF中所包含的内容。

if (totalMsg > 0) {
    totalMsg--;
    System.out.println(totalMsg + " left");
} else {
    System.out.println("finished all of " + totalMsg);
    break;
}