java中的并发包part1

The chapter one

线程池,线程间的通讯相关知识

1 一个是Executor的线程池的应用

Executor executor = Executors.newSingleThreadExecutor();

这个线程池里面一次只能运行一个

Runnable task1->一个长时间的任务

Runnable task2->一个长时间的任务

executor.execute(task1);

executor.execute(task2);

保证先运行完第一个,再运行第二个

1)     可以知道线程执行完没有?不能

2)     可以取消任务的执行么?可以,但必须是还没有执行的任务 

2 传统的runnable,不能有返回值,不抛出异常,我们不知道执行完没有,我们还想在线程之间进行传值

Okay,用Callable,Future来实现吧 

 

首先创建一个callable的task,让executorService去submit(),这个时候,这个task会到executor的容器中执行,执行完之后,返回future到原来的主线程中。

Future.get()直到线程运行完成之后,才能获取值,否则,一直blocking住了。

Demo:

//线程池管理线程实例

public class ThreadPoolClient {
public static void main(String[] args) {
Runnable task = new Runnable() {
public void run() {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("the current thread is " + Thread.currentThread().getName());
}
};
// ExecutorService server = Executors.newSingleThreadExecutor();
ExecutorService server = Executors.newFixedThreadPool(4);
try{
for(int i = 0;i < 10;i++) {
server.execute(task);
}
}finally {
server.shutdown();
}
}
}

 //使用Callable和future实现获取返回值

public class CommunicateBetweenThread {
public static void main(String[] args) {
Callable<String> task = new Callable<String>() {
public String call() throws Exception {
int i = 1 / 0;
return "返回执行结果";
}
};
ExecutorService server = Executors.newFixedThreadPool(4);
Future<String> f=null;
try{
for(int i = 0;i < 10;i++) {
f = server.submit(task);
System.out.println(f.get());
}
}catch(InterruptedException e) {
e.printStackTrace();
}catch(ExecutionException e) {
e.printStackTrace();
} finally {
server.shutdown();
}
}

还有ScheduledExecutorService,可以定时执行或者间隔多久执行一次。

使用线程池管理线程会更加灵活,可以关闭线程的运行,可以获取线程的数据和异常,以后应该尽量使用线程池技术去管理启动线程。

 3 shutdown

Shutdown,shutdownnow的区别

posted @ 2017-11-08 09:24  Hill_Dong  阅读(105)  评论(0)    收藏  举报