JAVA编程思想--并发

用并发解决的问题大体上可以分为“速度”和“设计可管理性”两种。

阻塞:如果程序中某个任务因为该程序控制范围之外的某些条件而导致不能继续执行,那么我们就说这个任务或线程阻塞了。

编写多线程程序最基本的困难在于协调不同线程驱动的任务之间对这些资源的使用,以使得这些资源不会同时被多个任务访问。



线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供。要想定义任务,只需实现Runnable接口并编写run()方法,使得该任务可以执行你的命令。

将Runnable对象转变为工作任务的传统方式是把它提交给一个Thread构造器。Thread t = new Thread(new RunnableClass()); t.start();    Thread构造器只需要一个Runnable对象。调用Thread对象的start()方法为该线程执行必须的初始化操作。然后调用Runnable的run()方法,以便在这个新线程中启动该任务。


JAVASE5的java.util.concurrent包中的执行器(Executor)将负责管理Thread对象,从而简化了并发编程。

ExecutorService exec = Executors.newCachedThreadPool();在程序执行过程中通常会创建与所需数量相同的线程,然后在它回收旧线程时停止创建新线程。

ExecutorService exec = Executors.newFixedThreadPool(int nThreads);

ExecutorService exec = Executors.newSingleThreadExecutor();如果向SingleThreadExecutor提交了多个任务,那么这些任务将排队,每个任务都会在下一个任务开始之前运行结束,所有的任务将使用相同的线程。

注意,在任何线程池中,现有线程在可能情况下,都会被自动复用。


Runnable是执行工作的独立任务,但是它不返回任何值。如果希望任务在完成时能够返回一个值,那么可以实现Callable接口。在JavaSE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表示的是从方法call()中返回的值,并且必须使用ExecutorService.submit()方法调用它。


对sleep()的调用可以抛出InterruptedExcption异常,它在run()中被捕获。因为异常不能跨线程传播回main(),所以必须在本地处理所有在任务内部产生的异常。(TimeUnit类)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值