加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 了解未来/线程

发布时间:2020-12-14 17:41:26 所属栏目:Java 来源:网络整理
导读:我试图第一次使用期货.看起来很聪明,你可以取消一份工作,但它不能按预期工作.在下面的示例中,只有第一个作业被取消.其余的完成了.我误解了期货的使用吗? public class ThreadExample { public static void main(String[] args) throws InterruptedException
我试图第一次使用期货.看起来很聪明,你可以取消一份工作,但它不能按预期工作.在下面的示例中,只有第一个作业被取消.其余的完成了.我误解了期货的使用吗?
public class ThreadExample 
{
    public static void main(String[] args) throws InterruptedException,ExecutionException 
    {
        int processors = Runtime.getRuntime().availableProcessors();
        System.out.println("Processors: " + processors);
        ExecutorService es = Executors.newFixedThreadPool(processors);
        int nowork = 10;
        Future<Integer>[] workres = new Future[nowork];
        for(int i = 0; i < nowork; i++)
        {
            workres[i] = es.submit(new SomeWork(i));
        }
        for(int i = 0; i < nowork; i++) 
        {
            if(i % 2 == 0)
            {
                System.out.println("Cancel");
                workres[i].cancel(true);
            }
            if(workres[i].isCancelled())
            {
                System.out.println(workres[i] + " is cancelled");
            }
            else
            {
                System.out.println(workres[i].get());
            }
        }
        es.shutdown();
    }
}

class SomeWork implements Callable<Integer> 
{
    private int v;
    public SomeWork(int v) 
    {
        this.v = v;
    }

    @Override
    public Integer call() throws Exception
    {
        TimeUnit.SECONDS.sleep(5);
        System.out.println(v + " done at " + (new Date()));
        return v;
    }
}

输出:

Processors: 4
Cancel
java.util.concurrent.FutureTask@10d448 is cancelled
4 done at Wed May 12 17:47:05 CEST 2010
2 done at Wed May 12 17:47:05 CEST 2010
1 done at Wed May 12 17:47:05 CEST 2010
3 done at Wed May 12 17:47:05 CEST 2010
1
Cancel
2  
3
Cancel
4
5 done at Wed May 12 17:47:10 CEST 2010
7 done at Wed May 12 17:47:10 CEST 2010
8 done at Wed May 12 17:47:10 CEST 2010
6 done at Wed May 12 17:47:10 CEST 2010  
5
Cancel
6
7
Cancel
8
9 done at Wed May 12 17:47:15 CEST 2010  
9

解决方法

问题是您的取消循环与您的get()循环重叠,阻塞.我想你想要有2个循环,不是吗?一个循环取消偶数编号的作业,然后取消第二个循环,检查哪些已被取消,哪些不被取消,然后取得相应的get().

它现在写的方式,在循环之前甚至有机会取消工作[2],它检查并请求工作的get()[1].

所以我想你需要3个阶段:

1. The `submit()` loop
2. The selective `cancel()` loop
3. The selective `get()` loop (which blocks)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读