1. 创建线程的方式
    1. 一个继承了Thread的类,new Thread()的时候传入
      1. Thread a=new Thread(myThread,"A");
    2. 继承Thread类,直接创建这个例的实例
      1. Mythread a=new Mythread(“name”);
    3. 实现runnable接口重写run,再创建Thread的实例,将实现runnable接口的类传入
      1. Thread a=new Thread(new A)
    4. 实现callable接口,重写call方法,创建一个带返回值的线程
  2. 线程是由主线程创建的
  3. 调用run方法意味着立即执行run()方法,不启动新的线程

而调用start方法意味着执行run()方法时机不确定,启动新的线程

  1. IsAlive()方法判断当前线程是否处于活动状态,对活动状态的定义:线程已经启动且尚未终止的状态即为活动状态。并且如果线程处于正在运行或准备开始运行的状态,也认为线程是存活的
    1. 用this调用isalive方法和用Thread.currentThread.isalive是有区别的
  2. 如果调用sleep方法所在的类是Thread,则执行this和thread调用是一致的,如果不是,则有区别
  3. 线程分为两类,一类是守护线程(后台线程),一类是用户线程(前台线程),当Java虚拟机启动的时候,通常有一个用户线程,一般是main方法的
  4. 线程创建的时候有个设置优先级,用的是线程对象.setPriority(int),一般都是默认,默认优先级为5,所创建的线程一般都是用户线程,如果想要变成守护线程,需要调用SetDaemon(true)设置为守护线程
  5. 守护线程都是为用户线程服务的,通过逻辑代码,例如gc回收器
  6. 单线程和多线程的区别???
    1. 单任务的特点是排队执行,即同步,必须等待这条命令执行完才可以下一个命令,在同一时间只能执行一个任务,CPU利用率大幅度低
    2. 多线程的优点就是多任务,可以在同一个时间可以执行多个任务,使用多线程也就是在使用异步,因为异步,所以线程被调用的时机是随机
  7. 为什么需要多线程???
    1. 系统中出现了阻塞
    2. 不依赖,比如业务分为AB,当A发生阻塞,B不依赖A执行的结果,则可以不使用多线程
  8. 多线程创建虽然是多种方式,但是Thread类是实现了Runable接口,他们之间具有多态关系,使用Thread最大的局限是不支持多继承,所以可以一边实现接口,一边继承。

用Thread继承和用runnable接口实现功能一样,没有本质区别

  1. Start()方法耗时的原因
    1. 通过jvm告诉操作系统创建Thread
    2. 操作系统开辟内存并使用Windows SDK中的createThread()函数创建Thread线程对象
    3. 操作系统对Thread对象进行调度,以确定执行时机
    4. Thread在操作系统中被成功执行
  2. 多次调用会出现Illegal-ThreadStataException异常
  3. 执行start的顺序不代表执行run的顺序
  4. 外炼互斥,内修可见,内功有序
  5. 自定义线程类中的实例变量针对其他线程可以有共享和不共享之分
    1. 不共享外炼互斥,内修可见,内功有序
    2. 共享

外炼互斥,内修可见,内功有序

  1. 在main方法里面调用sleep是使主方法休眠,在run方法里面调用sleep是让对应方法休眠
  2. 方法内声明的变量一定是安全的,非线程安全性问题一般出现在实例变量中
  3. Isalive()判断线程是否存活
  4. 外炼互斥,内修可见,内功有序
  5. 外炼互斥,内修可见,内功有序
  6. 外炼互斥,内修可见,内功有序
  7. 外炼互斥,内修可见,内功有序
  8. 外炼互斥,内修可见,内功有序
  9. 外炼互斥,内修可见,内功有序
  10. 外炼互斥,内修可见,内功有序
  11. Sychronized可以放在修饰符或者返回值前面
  12. 外炼互斥,内修可见,内功有序
  13. 牢记共享,只有共享资源的读写访问才需要加锁
  14. 外炼互斥,内修可见,内功有序
  15. 外炼互斥,内修可见,内功有序锁重入也支持父子类继承的环境,所以可以锁父类的方法就OK

外炼互斥,内修可见,内功有序

  1. 出现异常,锁会自动释放,但是suspend和sleep方法调用不释放锁
  2. 重写方法如果不使用synchronized,即是非同步方法,异步不存在争抢,根本没必要上锁
  3. 用锁必须为同一个,println也是上锁的,多个锁就是异步
  4. 在静态static方法上使用synchronized关键字声明同步方法时,使用当前静态方法所在类对应的class类的单例对象作为锁
  5. 虽然将sychronized关键字加到非static方法上的效果是一样的——同步,但是两个还是有本质区别,加到静态方法上时将class类对象作为锁,而加到非静态方法上的方式是将方法所在类的对象作为锁
  6. 同一个内部类中不同方法使用的是不同的锁,所以也是异步的
  7. 外炼互斥,内修可见,内功有序
  8. 外炼互斥,内修可见,内功有序
  9. 外炼互斥,内修可见,内功有序

相关文章: