Future获取线程返回值能使线程顺序执行?

线程非安全的方法getNext()java

import net.jcip.annotations.NotThreadSafe;

@NotThreadSafe
public class UnSafeSequence 
{
    
    private int value;
    
    public int getNext()
    {
        return value++;
    }
}

一、最开始的目的是测试线程池执行getNext()方法的返回值安全

main函数以下:函数

public class UnSafeQequenceTest
{

    /**
     * @throws ExecutionException
     * @throws InterruptedException
     */

    public static void main(String[] args)
    {
        UnSafeSequence unSafeSequence = new UnSafeSequence();

        ExecutorService executors = Executors.newCachedThreadPool();
        for (int i = 0; i < 100; i++ )
        {
            executors.submit(() -> System.out.println(unSafeSequence.getNext()));
        }
        executors.shutdown();
    }

}

结果如预期般是乱序的:测试

二、顺便试一下采用Future来接收线程执行的结果线程

main方法修改以下:code

public class UnSafeQequenceTest
{

    /**
     * @throws ExecutionException
     * @throws InterruptedException
     */

    public static void main(String[] args)
        throws InterruptedException, ExecutionException
    {
        UnSafeSequence unSafeSequence = new UnSafeSequence();
        List<Integer> lstNumber = new ArrayList<Integer>();

        ExecutorService executors = Executors.newCachedThreadPool();
        for (int i = 0; i < 100; i++ )
        {
            Future<Integer> future = executors.submit(() -> unSafeSequence.getNext());
            Integer temp = future.get();
            System.out.println(temp);
            lstNumber.add(temp);
        }
        Integer max = 0;
        for (Integer e : lstNumber)
        {
            if (e >= max)
            {
                max = e;
            }
            else
            {
                System.out.println(e);
                System.out.println(lstNumber);
            }
        }
        executors.shutdown();
    }

}

而后执行的结果是:对象

输出的顺序没有丝毫问题,WTF?这好像不太正常啊 blog

难道是Future对象获取线程返回结果时致使的主线程阻塞引发的之外效果?ip

相关文章
相关标签/搜索