原先多线程并发编程的学习笔记和代码整理一下贴上来。
---------------------------------
Runnable与Callable
Runnable工作是执行独立的任务,它不具备任何返回值。如果需要任务需要完成后返回一个值,使用Callable接口。
一、Runnable:
无返回值(void),如下
class Worker implements Runnable{ private static int workerCount = 0; //线程总数 private final int workId = workerCount++; //final初始化后值不会变 private int workTime = 3; //每个线程执行3次 public void run() { while(workTime-- > 0){ System.out.println("workId:#"+workId+" workTime:"+workTime+" working..."); } } }
此处定义了一个Worker任务,每个任务内部打印Id和执行次数。
启动任务执行:new Thread(new Worker()).start()
二、Callable:
通过泛型的方式,指定返回值的类型,下面是一个返回String的例子。
class TaskWithResult implements Callable<String>{ private int i=3;//每个线程执行3次 public String call() throws Exception { while(true){ if(--i==0) return "thread name:"+Thread.currentThread().getName(); } } }
定义一个任务,该任务执行3次,最后返回该线程名字。注意Callable指定了类型为<String>,因此call方法的返回值为String类型。
使用方法:
ExecutorService exec = Executors.newCachedThreadPool(); List<Future<String>> list = new ArrayList<Future<String>>(); for(int i=5;i>0;i--){ list.add(exec.submit(new TaskWithResult())); } for(Future<String> fs:list){ try { if(fs.isDone()){//如果task已经完成 System.out.println("callable return:"+fs.get()); }else{ System.out.println("cancel:"+fs.cancel(true)); System.out.println("isCancelled:"+fs.isCancelled()); } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); }finally{ exec.shutdown();//关闭线程池. } }
此处创建了一个线程池,启动5个任务,每次使用submit提交任务后会返回一个Future对象。
Future表示异步计算的结果,提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
后面对Future列表进行遍历,检查每个task是否完成。如果还没有完成,直接取消任务。
注意,如果不使用isDone判断task是否执行完,使用Future的get方法会一直阻塞,直到任务完成。
相关推荐
2 如何使用FutureTask 、Future、Callable、线程池实现线程2.1 FutureTask + Callable实现多线程2.2 线程池+Future+Callable 实现多线程3 Runnable、Callable、Future和FutureTask之间的关系3.1 整体关系介绍3.2 ...
主要介绍了Java中的Runnable,Callable,Future,FutureTask的比较的相关资料,需要的朋友可以参考下
大家都知道Runnable和Callable接口都可以作为其他线程执行的任务,但是Runnable接口的run方法没有返回值,而Callable接口的call方法有返回值,那么Callable接口是如何做到的呢?在此我给出一个Demo,看看通过...
│ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...
NULL 博文链接:https://pengqb.iteye.com/blog/738210
本资源致力于向您介绍 Java 并发编程中的线程基础,涵盖了多线程编程的核心概念、线程的创建和管理,以及线程间通信的基本方法。通过深入学习,您将建立扎实的多线程编程基础,能够更好地理解和应用多线程编程。 多...
主要介绍了Java 线程(Thread,Runnable,Callable)实例详解的相关资料,这里对java 线程的三种方法进行了对比,需要的朋友可以参考下
│ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...
Executor: 一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable command),该方法接收一个Runable实例,它用来执行一个任务,任务即一个实现了Runnable接口的类,一般来说,...
继承Thread类实现多线程: 1. 在Java中负责实现线程功能的类是java.lang.Thread 类。 2. 可以通过创建 Thread的实例来创建新的线程。 3. 每个线程都是通过某个特定的Thread对象所对应的方法run( )来完成其操作的,...
1、Java有两种实现多线程的方式:通过Runnable接口、通过Thread直接实现,请掌握这两种实现方式,并编写示例程序。 2、多线程是并发执行的,交替占有cpu执行,请编写示例程序,并观察输出结果。 3、采用线程同步方法...
本书从并发处理的视角探讨Java编程。首先详细介绍了并发应用程序的设计原理,阐述了如何对串行算法进行并行化处理。然后介绍了Thread类和Runnable接口,它们是Java并发API的重要组成部分。接着讨论了如何利用Java...
面向小白学习法——Thread和Runnable,扩展Callable! Thread和Runnable的区别 (Callable扩展) 线程 Thread Runnable 扩展——Callable 面向小白学习法——Thread和Runnable,扩展Callable! Thread和...
6、"volatile与synchronized的巧妙运用,确保数据可见性,解决并发编程中的常见痛点。#并发控制 #Java并发原语" 7、"精通Java线程调度算法,理解抢占式调度机制,更好地设计高性能多线程应用。#线程调度 #Java并发...
Java并发编程从入门到进阶 多场景实战,众所周知,并发编程是优秀工程师的标准之一,但知识庞杂,复杂性高,常常让人望而却步。但如果没有掌握背后的核心原理,你开发的代码可能会成为难以调试和优化的头疼问题。在...
Java具有简单性、面向对象...区别:Callable的 call() 方法可以返回值和抛出异常, 而Runnable的run()方法不能返回值也不能抛出异常。 Callable是需要使用java.util.concurrent.ExecutorService.submit(Callable)方
add 实验一:多线程/2.Runnable接口. 实验八:JDBC数据库编程二——存储过程与函数 add 实验八:JDBC数据库编程二——存储过程与函数/2.addTwoNumAndReturn. 实验十:Socket编程 add 实验十:Socket编程/...
Java多线程--创建多线程的基本方式二:实现Runnable接口