栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

实现 Callable 创建“多”线程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

实现 Callable 创建“多”线程

1.网传最广但未达预期的方式

        不明原因,尽管创建了多个线程,最终总是某一个线程在单独执行,不能同时工作,这就失去了多线程程序的意义。

class MyThread3 implements Callable {
    int ticket = 2000;

    @Override
    public String call() throws InterruptedException {
        while (true) {
            synchronized (this) {
                if (ticket > 0) {
                    System.out.println(Thread.currentThread().getName() + ": " + ticket);
                    ticket--;
                } else {
                    break;
                }
            }
        }
        return ticket + "";
    }
}

public class ThreadCreate3 {
    public static void main(String[] args) throws Exception {
        test1();
    }

    public static void test1() throws ExecutionException, InterruptedException {
        MyThread3 m1 = new MyThread3();
        FutureTask futureTask = new FutureTask<>(m1);
        new Thread(futureTask, "线程1").start();
        new Thread(futureTask, "线程2").start();
        Map maps = Thread.getAllStackTraces();
    }
}

        看线程元素栈内确实是创建了这两个线程,但是实际执行的效果始终是只有一个线程在跑。

2.通过线程池创建(亲测可用)
public static void test2() throws ExecutionException, InterruptedException {
    MyThread3 m1 = new MyThread3();
    MyThread3 m2 = new MyThread3();

    // 创建两个线程
    ExecutorService service = Executors.newFixedThreadPool(2);
    Future result1 = service.submit(m1);
    Future result2 = service.submit(m2);

    // 获取结果
    String s1 = result1.get();
    String s2 = result2.get();

    // 关闭服务
    service.shutdownNow();
}
3.为什么第一种方式事与愿违?

        简单跟踪了下源码没有头绪。

        目前已知,futureTask 是 Runnable 的实例,而常规实现 Runnable 创建的线程执行的是 run 方法,而 futureTask 实例化时放入的是一个 Callable 实例,线程执行的是 call 方法。两者使用的方法不同,几乎相同的写法带来的结果不同。因此不能把 Callable 创建线程方法类比成 Runnable 方法。        

4.猜想

        Callable 设计只是用来让线程执行方法返回值,如果类似 Runnable 那种创建方式,那么多线程共享一份数据实例,返回值只能返回一份数据,就变得没有意义。

        所以 Callable 更类似于 Thread 创建方式的加强版。而方法二能成功,恰恰是因为创建了两个 Callable 实例,这与 Thread 非常相似。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/678774.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号