Java多线程学习笔记

概念部分:

1.并发和并行的区别:

   并发 (Concurrency):一个处理器“同时”处理多个任务

   并行 (Parallelism):多个处理器 “同时”处理多个任务

2.多线程的优点和缺点:

  多线程的优点: 

    可并行处理任务,减少单个任务的等待时间

    线程较进程或子进程系统开销小

    线程间较容易共享资源

    多核情况下可充分利用CPU资源

  多线程的缺点:
    访问冲突
    锁竞争
      –死锁
      –锁粒度
  上下文切换开销
  同步/内存拷贝开销

示意图:

 

  • 新状态: 一个新产生的线程从新状态开始了它的生命周期。它保持这个状态知道程序start这个线程。
  • 运行状态:当一个新状态的线程被start以后,线程就变成可运行状态,一个线程在此状态下被认为是开始执行其任务
  • 就绪状态:当一个线程等待另外一个线程执行一个任务的时候,该线程就进入就绪状态。当另一个线程给就绪状态的线程发送信号时,该线程才重新切换到运行状态。
  • 休眠状态: 由于一个线程的时间片用完了,该线程从运行状态进入休眠状态。当时间间隔到期或者等待的时间发生了,该状态的线程切换到运行状态。
  • 终止状态: 一个运行状态的线程完成任务或者其他终止条件发生,该线程就切换到终止状态

语法糖: 

1.定义线程名字(ID)和循环数

//定义线程循环次数
protected int countDown = 10;
//可以在线程中设定ID并打印来区分各个线程
private static int taskCount = 0;
private final int id = taskCount++;

while(countDown-- >0){
}

 2.获取线程名称

System.out.println(Thread.currentThread().getName()+":"+value);
... 
Thread t1 = new Thread(us,"t1");

JVM部分:

关于锁:

1.某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法; 

《Tinking In Java》部分:

1.并发具有可论证的确定性,但是实际上具有不可确定性。

2.如果没有任务会阻塞,那么在单处理器机器上使用并发就没有任何意义。

3.某些编程语言被设计为可以将并发任务彼此隔离,这些语言通常被称作函数型语言——erlang。

4.语法糖:while(countDown-- >0)、private final int id = taskCount++; 使用后置的++和--,可以进行计数器加减的操作,方便又清晰。

5.各种执行器(Executor):

  CachedThreadPool:一般首选,会创建于所需数量相同的线程。

  FixedThreadPool:事先分好好线程,限制了线程数量。

  SingleThreadExecutor就像是线程数量为1的FixedThreadPool(它提供了长期存活和并发保证,适合于某些特定任务)。SingleThreadExecutor会序列化所有提交给它的任务。

6.如果希望任务完成时能返回值,用callable代替runnable接口。

资料:

http://blog.csdn.net/csh624366188/article/details/7318245

原文地址:https://www.cnblogs.com/xujanus/p/4384559.html