Java 线程笔记

Java 实现多线程的方式

  1. 继承 Thread

    Thread 本身实现了 Runnable 接口,实际上完成了一个代理的操作,具体的功能仍由 Runnale.run() 来完成,是一个典型的代理设计模式。

  2. 实现Runnable

    实现 Runnable 接口相对于继承 Thread 类来说更为灵活,可以继承其他类,也比较容易实现资源的共享。

  3. Timer 和 TimerTask

    Timer 实现了类似闹钟的功能,定时或隔一定时间触发一次线程。scheduleAtFixedRate 修正时间。

    在实际使用中,Timer 可以启动多个 TimerTask, 但 Timer 是线程安全的,会存在阻塞, 最好还是一个 Timer 启动一个 TimerTask。

线程的生命周期

能执行就执行,不能就等,再不行就去死。

多线程安全、互斥、同步、死锁

多线程安全问题通常还是临界资源的问题,同时操作临界资源,数据可能会乱掉,就卖票那例子。

1、最简单的思路就是使用同步关键字 synchronized,保证操作的完整性。

synchronized 同步方法或代码块

2、我所理解的互斥就是,多个操作在同一时间只能由一个线程执行,其他线程要等待该线程结束后才能继续执行。解决了问题也带来了新的问题。

别的线程啥也不干,干等总是耗费资源的,并且不能保证线程的执行顺序,万一等了一辈子也没轮到它执行呢…

3、Object类本身就支持同步处理,也就是 wait 和 notify,这两个方法都只能在 synchronized 修饰的方法或语句块内部采用被调用。其中 wait 方法的作用是使调用该方法的线程休眠,也就是使该线程退出 CPU 的等待队列,处于冬眠状态,不执行动作,也不占用 CPU 排队的时间,notify方法的作用是唤醒一个因为该对象的线程,该线程当前处于休眠状态,至于唤醒的具体是那个则不保证。

如度娘上说:同步是一种更为复杂的互斥,互斥一种特殊的同步

4、死锁指两个或两个以上的线程为了使用某个临界资源而无限制的等待下去,就是同步的多了呗,要有节制…

sleep 与 wait 的区别:

sleep休眠,让出CUP,不释放对象锁(监视器的所属权)

wait等待,让当前线程进入等待池,让CPU,释放对象锁。

线程的优先级

默认normal,能调高调低,但都说效果不大,看操作系统心情……

守护线程

setDeamon,没什么可守也就结束了吧…

你可能感兴趣的:(java,线程)