美文网首页
java并发

java并发

作者: gaoweibupt | 来源:发表于2016-03-17 00:29 被阅读0次

    基本线程

    线程

    一个线程就是在进程中的一个单一的顺序控制流,因此,单个进程可以拥有多个并发执行的任务。
    1.继承Thread类,并且实现run()方法。
    2.Runnable接口对象的run()方法。
    Runnable更加体现面向对象,Thread是一个线程,Runnable是线程的代码。

    定义任务

    实现Runnable接口并编写run()方法,Runnable接口只有run()方法。
    run()方法是顺序执行的。

    Runnable对象转变为工作任务

    调用Thread的start()方法

    Executor执行器

    Executor在客户端和任务执行之间提供了一个间接层,Executor允许管理异步任务的执行,无需显式地管理线程的生命周期。

    • CachedThreadPool在执行过程中通常会创建与所需数量相同的县城,然后在它回收线程时停止创建新线程。
    • FixedThreadPool使用的Thread对象的数量是有界的。
    • SingleThreadExecutor就是线程数量为1的FixedThreadPool,确保任意时刻再任何线程中都只有未已的任务在运行。

    具有返回值的任务

    实现Callable接口而不是Runnable接口,实现接口的(具有返回值)call()方法,并且使用ExecutorService.submit()方法调用它。
    submit()方法会产生Future对象,可以调用Future对象的get()方法来获取该结果。
    可以调用isDone()方法来检查Future是否已经完成。

    休眠

    concurrent包里提供了TimeUnit类,可以调用sleep()方法进行休眠。

    优先级

    可以通过getPriority()方法读取现有线程的优先级,setPriority()方法设置优先级。

    让步

    Thread.yield()

    后台线程

    程序在运行时在后台提供一种通用服务的线程,当所有非后台线程结束时,程序也就终止了,例如main().
    线程启动之前调用setDaemon(true)方法,设置为后台线程。
    可以调用isDaemon()方法确定线程是否是一个后台线程

    加入一个线程

    一个线程可以在其他线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行。对join()方法的调用可以被中断,做法是在调用线程上调用interrupt()方法

    共享受限资源

    序列化访问共享资源,即在给定时刻只允许一个任务访问共享资源(加锁)。

    同步

    Java以提供关键字synchronized的形式,为防止资源冲突提供了内置支持。
    共享资源一般是以对象形式存在的内存片段,但也可以是文件,输入\输出端口,或者是打印机。
    每个访问临界共享资源的方法都必须被同步

    显示Lock对象

    java.util.concurrent类库定义有java.util.concurrent.locks中的显式的互斥机制。

    原子性和易变性

    原子操作是不能被线程调度机制中断的操作,原子性可以应用于除long和doubel之外的基本类型之上的'简单操作'

    原子类:AtomicInteger、AtomicLong、AtomicReference原子性变量类

    临界区:防止多个线程同时访问方法内部的部分代码而不是访问整个方法,通过这种方式分离出来的代码段被称为临界区。

    synchronized(syncObject){
      //This code can be accessed
      //by only one task at a time
    } 
    

    线程本地存储

    防止任务在共享资源上产生冲突的第二种方式是根除对变量的共享。线程本地存储是一种自动化机制,可以为使用相同变量的每个不同的线程都创建不同的存储。
    创建和管理线程本地存储可以由java.lang.ThreadLocal类来实现。.

    线程之间的协作

    wait()和notify()

    wait()被调用时,线程的执行被挂起,对象上的锁被释放。
    可以通过notify() 或者notifyAll(),或者令时间到期,从wait()中恢复执行。
    只能在同步控制方法或同步控制块里调用wait()、notify()和notifyAll()

    线程内部的数据共享

    ThreadLocal线程局部变量。一个ThreadLocal代表一个变量,ThreadLocal每个使用该变量的线程提供独立的变量副本。
    ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键位线程对象,而值对应线程的变量副本。

    生产者与消费者

    死锁

    某个任务在等待另一个任务,而后者又等待别的任务,这样一直下去,直到这个链条上的任务又在等待第一个任务释放锁。这得到了一个任务之间相互等待的连续循环,没有哪个线程能继续。

    相关文章

      网友评论

          本文标题:java并发

          本文链接:https://www.haomeiwen.com/subject/gkxclttx.html