并发编程学习笔记(一)

来源:互联网 发布:软件安全培训 编辑:程序博客网 时间:2024/06/07 10:08

        如果想要一个程序运行得更快,那么可以将其断开为多个片段,在单独的处理器上运行每个片段,并发是用于多处理器编程的基本工具。如果你有一个多处理器机器,那么就可以在这些处理器之间分布多个任务,从而可以极大的提高吞吐量。但是并发通常是提高运行在单处理器上的程序的性能。在单处理器上运行得并发程序开销确实应该比该程序的所有部分都顺序执行开销大,因为其中增加了所谓的上下文切换的代价。而使这个问题变得不同的是阻塞。如果程序中某个任务因为控制范围之外的某些条件(通常是I/O)而导致不能继续执行,那么我们就说这个任务或者现程阻塞了。事实上,从性能角度看,如果没有任务会阻塞。那么在单处理器机器上使用并发就没有任何意义。

        在单CPU机器上使用多任务的程序在任意时刻任旧只在执行一项工作。并发编程使我们可以将程序划分为多个分离的,独立运行得任务通过多线程机制,这些独立任务中的每一个都将由执行线程来驱动。一个线程就是在进程中的一个单一的顺序控制流。单个进程可以拥有多个并发执行的任务,但是你的程序使得每个任务都好像有其自己的CPU一样,其底层机制是切分CPU时间。CPU轮流给每个任务分配其占用时间,每个任务都觉得自己在一直占用CPU,但实际上CPU时间是划分成片段分配给了所有的任务。

下面一个Java编程思想中例子

package com.minyi.concurrent;public final class LiftOff implements Runnable{    protected int countDown=10;    private static int taskCount=0;    private final int id=taskCount;    public LiftOff()    {           }        public LiftOff(int countDown)    {        this.countDown=countDown;    }        public  String status()    {        return "#"+id+"("+(countDown>0?countDown:"Liftoff")+"),";    }        @Override    public void run()    {       while(countDown-- >0)       {            System.out.println(status());            //任务切换            Thread.yield();       }            }}

package com.minyi.concurrent;public class Test{    public static void main(String[] args)    {        LiftOff liftOff=new LiftOff();                //liftOff.run();                Thread thread=new Thread(liftOff);        thread.start();        System.out.println("等咯");    }}


使用Executor

Java SE5的Executor执行器可以管理Thread对象,从而简化了并发编程。Executor在客户端和任务执行之间提供了一个间接层,与客户端直接执行任务不同,这个中介对象将执行任务。Executor允许你管理异步任务的执行,而无需显示的管理线程的生命周期,下面例子用Executor管理Thread对象

package com.minyi.concurrent;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Test{    public static void main(String[] args)    {        //LiftOff liftOff = new LiftOff();        // liftOff.run();        // Thread thread=new Thread(liftOff);        // thread.start();        // for (int i = 0; i < 5; i++)        // {        // new Thread(new LiftOff()).start();        // }        ExecutorService exec = Executors.newCachedThreadPool();        for (int i = 0; i < 5; i++)        {          exec.execute(new LiftOff());        }        exec.shutdown();        System.out.println("等咯");    }}
shutdown()方法的调用可以防止新任务被提交给这个Executor

newCachedThreadPool():在程序执行过程中通常创建与所需数量相同的线程

newFixedThreadPool():一次性预先执行代价高昂的线程分配,可以限制线程的数量,这可以节省时间

newSingleThreadExecutor():确保任意时刻在任何线程中都只有唯一的任务在运行。在这种方式中,你不需要在共享资源上处理同步





0 0