`

java 多线程Callable和Runable执行顺序问题详解

阅读更多

详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt125

 

毫无疑问 Runnable会进行异步执行,此处不多数,主要说明Callable的使用,看实例:

1、

public class ThreadTest {

    public static void main(String[] args) throws InterruptedException, ExecutionException {

        ExecutorService executor = Executors.newFixedThreadPool(4);

        MyTread m1 = new MyTread();

        Future f = executor.submit(m1);

        // System.out.println(f.get());

        executor.shutdown();

        System.out.println("akb");

    }

 

}

 

class MyTread implements Callable<String> {

    @Override

    public String call() {

        try {

            System.out.println("线程调度:" + Thread.currentThread());

            TimeUnit.SECONDS.sleep(3);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        return "123";

    }

}

此程序虽然获取了call方法的返回值,但是没有做处理,所以主线程main和m1同时执行,执行结果如下:

主线程执行完了

线程调度:Thread[pool-1-thread-1,5,main]

 

2、

public class ThreadTest {

    public static void main(String[] args) throws InterruptedException, ExecutionException {

        ExecutorService executor = Executors.newFixedThreadPool(4);

        MyTread m1 = new MyTread();

        Future f = executor.submit(m1);

        System.out.println(f.get()); // 进行了输出

        executor.shutdown();

        System.out.println("主线程执行完了");

    }

 

}

 

class MyTread implements Callable<String> {

    @Override

    public String call() {

        try {

            System.out.println("线程调度:" + Thread.currentThread());

            TimeUnit.SECONDS.sleep(3);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        return "123";

    }

}

 

在2中,对m1中call方法的返回值在main中进行了处理(输出),所以在此种情况下,main需要等待m1执行完,再继续执行,执行结果如下

线程调度:Thread[pool-1-thread-1,5,main]

123

主线程执行完了

 

3、再看当主线程中同时启动两个由Callable生成的线程时

public class ThreadTest {

    public static void main(String[] args) throws InterruptedException, ExecutionException {

        ExecutorService executor = Executors.newFixedThreadPool(4);

        MyTread m1 = new MyTread();

        MyTread2 m2 = new MyTread2();

        Long time1 = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());

        Future f = executor.submit(m1);

        Future f2 = executor.submit(m2);

        System.out.println(f.get()); // 进行了输出m1

        System.out.println(f2.get()); // 进行了输出m2

        executor.shutdown();

        System.out.println("主线程执行完了");

        Long time2 = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());

        System.out.println("主线程等待了" + (time2 - time1) + "秒");

    }

 

}

 

class MyTread implements Callable<String> {

    @Override

    public String call() {

        try {

            System.out.println("线程调度:" + Thread.currentThread());

            TimeUnit.SECONDS.sleep(3);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        return "123";

    }

}

 

class MyTread2 implements Callable<String> {

    @Override

    public String call() {

        try {

            System.out.println("线程调度2:" + Thread.currentThread());

            TimeUnit.SECONDS.sleep(3);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        return "abc";

    }

}

当不对m1和m2做输出时,main和m1、m2并发执行,当对m1和m2中任意一个的返回值进行处理的时候,main需要等待,但是m1和m2之前仍然是并发执行,执行结果如下:

线程调度2:Thread[pool-1-thread-2,5,main]

线程调度:Thread[pool-1-thread-1,5,main]

123

abc

主线程执行完了

主线程等待了3秒

 

分享到:
评论

相关推荐

    Java多线程Callable和Future接口区别

    Java多线程Callable和Future接口的使用场景非常广泛,如计算复杂的数学问题、处理大规模数据、实现高性能的服务器等等。在这些场景中,我们可以使用Callable和Future接口来实现异步计算,从而提高系统的性能和可扩展...

    Java使用Callable和Future创建线程操作示例

    Java使用Callable和Future创建线程操作示例主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项。 首先,Java 5开始,Java提供了...

    java callable(多线程)

    ### Java Callable与多线程详解 在Java编程中,`Callable`接口是处理多线程问题的一个重要概念,尤其在需要从线程中返回结果的情况下。`Callable`接口与我们熟知的`Runnable`接口相似,但功能更加强大,主要体现在...

    Java多线程详解

    以上是对"Java多线程详解"主题的详细阐述,涵盖了Java多线程的基本概念、实现方式、线程控制、线程池、并发集合、线程间通信以及并发编程中常见的问题和解决方案。学习和熟练掌握这些内容对于开发高效的多线程Java...

    Java多线程Callable接口

    Runnable是执行工作的独立任务,但是它不返回任何值,如果你希望任务在完成时能够返回一个值,那么可以实现Callable接口而不是Runnable接口。在Java SE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表示...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...

    汪文君JAVA多线程编程实战(完整不加密)

    这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是并发处理的基础,对于构建高效、可扩展的系统至关重要。 Java多线程允许程序同时执行多个独立的代码...

    java多线程处理数据库数据

    然而,为了更好地管理和控制线程,Java并发包提供了如`ExecutorService`、`Future`、`Callable`等高级接口和类,它们简化了多线程编程,并提供了更好的资源管理。 在处理数据库数据时,我们通常会使用JDBC(Java ...

    java多线程实现大批量数据导入源码

    此外,需要注意的是,多线程环境下可能存在竞态条件、死锁等问题,需要合理使用`synchronized`关键字或`Lock`接口来保证数据的一致性和安全性。另外,适当的错误处理和日志记录也是必不可少的,以确保程序的健壮性。...

    Java多线程技术精讲

    Java中控制线程的方法有多种,如start()启动线程,run()执行线程,sleep()让线程休眠,join()等待其他线程完成,yield()让当前线程暂停,让其他线程有机会执行,以及interrupt()和isInterrupted()用于中断和检查线程...

    java多线程,对多线程,线程池进行封装,方便使用

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,我们可以通过实现Runnable接口或继承Thread类来创建线程。然而,直接使用线程可能存在一些问题,如资源管理...

    java 多线程示例

    Java多线程是Java编程中的重要概念,尤其在开发高性能、高并发的应用中不可或缺。本示例旨在为初学者提供一个全面理解Java多线程的起点。通过学习这个实例,你可以掌握如何创建和管理线程,理解线程同步与通信的重要...

    Java多线程Callable接口实现代码示例

    Java 多线程 Callable 接口实现代码示例 Java 多线程编程中,创建线程有多种方式,其中一种便是实现 Callable 接口。Callable 接口是一个函数式接口,定义了一个 call 方法,该方法可以抛出异常并返回结果。与 ...

    JAVA 多线程的PPT和示例

    Java多线程是Java编程中的一个核心概念,它允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。在Java中,多线程主要通过两种方式实现:继承Thread类和实现Runnable接口。这份"JAVA多线程的PPT和示例...

    Java多线程设计模式_清晰完整PDF版 Java多线程设计模式源代码

    Java多线程设计模式是Java开发中的重要领域,它涉及到如何在并发环境下高效、安全地管理资源和控制程序执行流程。本资料集包含了清晰完整的PDF版书籍和源代码,为学习和理解Java多线程设计模式提供了丰富的素材。 ...

    java通过线程控制程序执行超时(新)

    在Java编程中,控制程序执行超时是一项重要的任务,特别是在多线程环境下,我们可能需要确保某个任务不会无限制地运行下去,导致资源耗尽。本文将深入探讨如何使用Java的线程机制来实现程序执行的超时控制,同时也会...

    java多线程设计模式详解

    Java多线程设计模式是Java编程中不可或缺的一部分,它涉及到如何在并发环境下高效、安全地组织代码...阅读提供的"java多线程设计模式详解.pdf"和"Java多线程设计模式源码"文件,将能更深入地理解这些模式的实际运用。

    Java多线程的总结

    Java提供了多种线程间通信的方法,如wait()、notify()和notifyAll(),它们必须在同步块或同步方法中使用,用于控制线程的执行顺序。此外,还可以使用BlockingQueue阻塞队列实现生产者消费者模式,实现线程间的协作。...

    java多线程并发

    ### Java多线程并发知识点详解 #### 一、Java多线程并发简介 在现代软件开发中,特别是在Java这样的主流编程语言中,多线程并发技术是提高程序执行效率、优化资源利用的关键手段之一。本篇文章将深入探讨Java中的...

Global site tag (gtag.js) - Google Analytics