Java并发编程(一)
2016-03-12 14:15
465 查看
一、定义任务
线程驱动任务,因此需要一种描述任务的方式,可以用Runnable接口来提供,必需实现Runnable接口中的run方法:
二、Thread类
将Runnable对象转变为工作的传统方式是把他提交给一个Thread构造器
Thread构造器只需要一个Runnable对象。调用Thread对象的start()方法执行必需的初始化操作,然后调用Runnable()的Run()方法,以便在在这个新线程中启动该任务。
三、使用Executor
CachedThreadPool将为每个任务都创建一个线程
有了FixedThreadPool就可以一次性预先执行代价高昂的线程分配,因此就可以限制线程的数量了。
SingleThreadExecutor就像是线程为1的fixedTHreadPool。如果他提交了多个任务,那么这些任务将排队,每个任务都会在下一个任务开始之前运行结束,所有的任务将使用相同的线程。
四、从任务中产生返回值
Runnable是执行工作的独立任务,但是他不返回任何值,要想在任务完成时返回一个值,那么久可以实现Callable接口而不是Runnable接口。
线程驱动任务,因此需要一种描述任务的方式,可以用Runnable接口来提供,必需实现Runnable接口中的run方法:
public class LiftOff implements Runnable { protected int countDown=10; private static int taskCount=0; private final int id=taskCount++; public LiftOff() { // TODO Auto-generated constructor stub } public LiftOff (int countDown) { this.countDown=countDown; } public String status(){ return "#"+id+"("+(countDown>0?countDown:"liftoff!")+"),"; } public void run() { while(countDown-->0){ System.out.println(status()); Thread.yield(); } } public static void main(String[] args) { LiftOff launch=new LiftOff(); launch.run(); } }id是final类,一但被赋值就不会被改变。run方法需要一个条件来跳出循环,静态方法Thread.yield()的调用是对线程调度器的一种建议,他在声明:“我已经执行完生命周期的最重要的部分了,此刻正是切换给其他任务执行一段时间的大好时机”。
二、Thread类
将Runnable对象转变为工作的传统方式是把他提交给一个Thread构造器
public class BasicTreads { public static void main(String[] args) { /*Thread thread =new Thread(new LiftOff()); thread.start(); System.out.println("Waitting for liftOff");*/ for(int i=0;i<5;i++){ new Thread(new LiftOff()).start(); } System.out.println("Waitting for liftOff"); } }
Thread构造器只需要一个Runnable对象。调用Thread对象的start()方法执行必需的初始化操作,然后调用Runnable()的Run()方法,以便在在这个新线程中启动该任务。
三、使用Executor
CachedThreadPool将为每个任务都创建一个线程
import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CachedThreadPool { public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService exec =Executors.newCachedThreadPool(); for(int i=0;i<5;i++){ exec.execute(new LiftOff()); } exec.shutdown(); } }
有了FixedThreadPool就可以一次性预先执行代价高昂的线程分配,因此就可以限制线程的数量了。
import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class FixedThreadPool { public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService exec=Executors.newFixedThreadPool(5); for(int i=0;i<5;i++){ exec.execute(new LiftOff()); } exec.shutdown(); } }
SingleThreadExecutor就像是线程为1的fixedTHreadPool。如果他提交了多个任务,那么这些任务将排队,每个任务都会在下一个任务开始之前运行结束,所有的任务将使用相同的线程。
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SingleThreadPool { public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService exec=Executors.newSingleThreadExecutor(); for(int i=0;i<5;i++){ exec.execute(new LiftOff()); } exec.shutdown(); } }
四、从任务中产生返回值
Runnable是执行工作的独立任务,但是他不返回任何值,要想在任务完成时返回一个值,那么久可以实现Callable接口而不是Runnable接口。
import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; class TaskWithResult implements Callable<String>{ private int id; public TaskWithResult(int id) { this.id=id; } @Override public String call() throws Exception { return "result of TaskWithResult "+id; } } public class CallableDemo { public static void main(String[] args) { ExecutorService exec =Executors.newCachedThreadPool(); ArrayList<Future<String>> result=new ArrayList<>(); for (int i = 0; i < 10; i++) { result.add(exec.submit(new TaskWithResult(i))); } for(Future<String> fs: result){ try { System.out.println(fs.get()); } catch (InterruptedException e) { // TODO Auto-generated catch block System.out.println(e); return; } catch (ExecutionException e) { // TODO Auto-generated catch block System.out.println(e); }finally { exec.shutdown(); } } } }
相关文章推荐
- Java反射
- 3Sum | Java最短代码实现
- 20145330《Java学习笔记》第一章课后练习8知识总结以及IDEA初次尝试
- SpringMVC @RequestParam 中文乱码问题解决
- Java基础之修饰符
- java异常浅析
- 从JVM的角度看JAVA代码--代码优化
- Trie树的Java实现
- Java基础之String类
- Java正則表達式语法
- JAVA Executor实现并发线程
- struts2 json-plugin 提供跨站访问支持
- Java 高并发缓存与Guava Cache
- Java多线程之生产者消费者问题<二>:使用重入锁、条件变量优雅地解决生产者消费者问题
- XML以及XML解析方式[DOM+SAX]
- java编程基础小结
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- 搭建Hadoop2.7.2开发环境1(编译Eclipse中hadoop插件hadoop2x-eclipse-plugin)
- 关于java开发技巧
- SPRING循环依赖(circular reference)的解决方法