Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。
public static ExecutorService newFixedThreadPool(int nThreads)
创建固定数目线程的线程池。
public static ExecutorService newCachedThreadPool()
创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。
如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
public static ExecutorService newSingleThreadExecutor()
创建一个单线程化的Executor。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。
ExecutorService扩展了Executor并添加了一些生命周期管理的方法。一个Executor的生命周期有三种状态,运行 ,关闭 ,终止 。
Executor创建时处于运行状态。当调用ExecutorService.shutdown()后,处于关闭状态,isShutdown()方法返回true。
这时,不应该再想Executor中添加任务,所有已添加的任务执行完毕后,Executor处于终止状态,isTerminated()返回true。
如果Executor处于关闭状态,往Executor提交任务会抛出unchecked exception RejectedExecutionException
ExecutorService service = Executors.newFixedThreadPool(5);
for(int i=0;i<10;i++){
final int count = i;
Runnable runnable = new Runnable(){
public void run(){
System.out.println(Thread.currentThread().getName()+":"+count);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
service.submit(runnable);
}
service.shutdown();
Daemon线程
Thread thread = new Thread(new Runnable() {
public void run() {
while (true) {
System.out.println("hello world");
}
}
});
//不加这句主线程运行完之后,thread 将会继续执行,加上这句,当主线程结束时,thread也会结束
thread.setDaemon(true);
thread.start();
线程join
System.out.println("thread a run");
Thread threadB = new Thread(new Runnable(){
public void run(){
System.out.println("thread b begin");
try {
for(int i =0 ;i<5;i++){
Thread.sleep(1000);
System.out.println("thread b run");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread b end");
}
});
threadB.start();
//当线程使用join()加入至另一个线程时,另一个线程会等待这个被加入的线程工作完毕,然后再继续它的动作
try {
threadB.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread a end");
将 try join catch这块注释执行结果为:
thread a run
thread a end
thread b begin
thread b run
thread b run
thread b run
thread b run
thread b run
thread b end
放开后执行结果为:
thread a run
thread b begin
thread b run
thread b run
thread b run
thread b run
thread b run
thread b end
thread a end
Callable与Future
java.util.concurrent.Callable与java.util.concurrent.Future类可以协助您完成Future模式。
Future模式在请求发生时,会先产生一个Future对象给发出请求的客户。它的作用类似于代理(Proxy)对象,
而同时所代理的真正目标对象的生成是由一个新的线程持续进行。真正的目标对象生成之后,将之设置到Future之中
,而当客户端真正需要目标对象时,目标对象也已经准备好,可以让客户提取使用。
下面是一个简单的例子,Callable完成某个费时的工作,工作结束后传回结果对象,我假定返回字符串很费时.当数据还没有到达时显示not get real data
public class MyCallable implements Callable<String>{
private String init;
public MyCallable(String init){
this.init = init;
}
@Override
public String call() throws Exception {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return init+" hello world";
}
public static void main(String[] args) {
Callable<String> mycallable = new MyCallable("davide");
FutureTask<String> task = new FutureTask<String>(mycallable);
Thread t = new Thread(task);
t.start();
try {
while(true){
if(task.isDone()){
System.out.println(task.get());
break;
}else{
System.out.println("not get real data");
}
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
以下是对Java线程相关知识点的详细说明: 1. **线程的创建与执行** - 创建线程有两种方式:继承`Thread`类或者实现`Runnable`接口。继承`Thread`直接重写`run()`方法,而实现`Runnable`接口则需要提供一个包含业务...
了解线程池的概念也是Java多线程编程中的一个重要知识点。线程池是一种多线程处理形式,它将线程和任务的概念分离开来,能够有效管理线程资源,减少线程创建和销毁的开销,提高程序性能。Java中可以通过Executors类...
多线程 1. 什么是线程: 线程就是程序中单独顺序的流控制。线程本身不能运行,它只能用于程序中。 2. 什么是多线程: 多线程则指的是在单个程序中可以同时运行多个不同的线程执行不同的任务. 说明: 线程是程序内...
对Java线程总体知识的梳理,主要描述了关键知识点,可以梳理一下思路!
Java多线程知识点整理.pdf
多线程在我们的开发应用中也是回很常用的,希望里面的内容能够可以帮助到你们解决掉你们想要的问题,这是我所期望看到的
"Java多线程-知识点梳理和总结-超详细-面试知识点" Java多线程是Java编程语言中最基本也是最重要的概念之一。多线程编程可以提高程序的执行效率、改善用户体验和提高系统的可扩展性。但是,多线程编程也存在一些...
### 多线程知识总结 #### 一、线程基础概念 **线程状态:** 在探讨多线程之前,我们需要了解线程的基本状态转换。一个典型的线程生命周期包括以下几个阶段: 1. **Start(启动):** 当线程被创建后调用`start()`...
内容概要:本文汇总了有关Java多线程方面的28个面试题目及其详细解答,涵盖了线程的基础概念、线程创建方法、线程控制(启动、同步、休眠、停止)、高级特性和应用技巧(线程局部存储、线程池、同步器等)。...
下面将详细介绍标题和描述中涉及的线程相关知识点。 1. **创建线程**: - 使用`CreateThread`函数可以创建一个新的线程。这个函数需要指定线程函数的入口地址、参数、初始堆栈大小等信息。 - 也可以使用`_...
多线程技术知识点总结
以下是基于这个源代码的线程相关知识点的详细说明: 1. **线程创建**:在`CWorkerThread`构造函数中,使用`CreateThread`函数创建了一个新的线程。`CreateThread`函数接受多个参数,包括线程安全属性、初始堆栈大小...
根据提供的文件信息,我们可以从中提炼出关于线程管理和信号量操作的相关知识点。下面将详细解释这些知识点,并尽可能地提供丰富的信息。 ### 线程基础知识 #### 什么是线程? 线程是操作系统能够进行运算调度的...
以下是对标题和描述中提到的线程相关知识点的详细解释: 1. **Interrupt方法**:在.NET中,`Thread.Interrupt()`方法用于中断线程,但它可能会抛出`ThreadInterruptedException`。因此,调用此方法时需要捕获异常,...
多线程知识点.xmind
本文主要围绕Linux下C语言实现的多线程编程进行知识点总结,涉及线程与进程的区别、多线程的优势、Pthreads API以及线程安全和死锁预防。 首先,线程和进程是操作系统中两种基本的执行单元。线程是进程内部的执行流...
java 多线程知识点思维导读
以下是根据题目内容整理的一些Java线程相关知识点: 1. **线程睡眠**:`Thread.sleep()`方法用于使当前线程进入睡眠状态,参数单位为毫秒。例如,`sleep(10000)`表示线程将休眠10秒。 2. **线程创建方式**:Java...
以下是一些关键的线程相关知识点: 1. **创建线程**:你可以通过实例化`Thread`类并传递一个委托(如`ThreadStart`或`ParameterizedThreadStart`)来创建一个新的线程。委托通常指向包含线程执行逻辑的方法。 2. *...
通过shell调用`CreateProcess`函数启动应用程序,这会创建一个"进程核心对象",并分配一个4GB的虚拟地址空间,接着加载程序代码和数据到这个地址空间,同时创建一个主线程,由这个主线程执行程序的入口点——`...