多线程之线程调度
进程
一个内存中运行的应用程序,每个进程有独立的内存空间
线程
进程中的一个执行路径,共享内存空间,线程之间可以自由切换,并发执行,一个进程最少一个线程,线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程
分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度
优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性)
在Java中,线程优先级由整数表示,范围为0-10,在Thread类中有三个静态常量表示线程优先级
static int MAX_PRIORITY:线程最高的优先级,值为10
static int MIN_PRIORITY:线程最小的优先级,值为1
static int NORM_PRIORITY:默认优先级,值为5
Thread类中,可以使用setPriority()和getPriority()方法来设置和获取优先级
每个线程不设置优先级的话是默认优先级,多个默认优先级线程并发执行,主线程也是默认优先级。
Thread常用方法
Thread.sleep(long millis):线程睡眠,使线程阻塞,参数为睡眠的时间,以毫秒为单位,结束后继续执行任务
Object类中的wait()方法,线程等待,使当前线程等待,直到其他线程调用此对象的notify()方法或notifyAll()唤醒方法。
Thread.yield()方法:线程让步,暂停当前正在执行的线程对象,把执行机会让给相同或更高优先级的线程
jion():线程加入,等待其他线程终止,在当前线程中调用另一个线程的jion()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再有阻塞转为就绪状态
Object类中的notify():线程唤醒,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。 直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。类似的方法还有一个notifyAll(),唤醒在此对象监视器上等待的所有线程。
stop():线程终止,不推荐使用,无论线程执行到哪里,它都会立刻停止掉线程。当线程写完id = 1,再准备写name = 11时被stop(),释放锁。读线程获得锁进行读操作,读到id = 1,name = 0,数据不一致。