1 并发执行
应用程序可以同时运行(一边听歌,一边玩游戏)。 在应用程序中,不同的程序块也是可以同时运行,这种多个程序块同时运行的现象被称为 并发执行。 【在多任务操作系统中,表面上是支持并发执行的,所有的应用程序都是由CPU执行的,对于一个CPU而言,在某个时间点只能运行一个程序。由于CPU运行很快,感觉是并发执行的】
2 进程
在一个操作系统中,每个独立执行的程序都可称为一个进程。(QQ.exe)
3 线程 在一个进程中还可以有多个执行单元同时运行。这些执行单元可以看作程序的一条条线索,被称为线程。 【当一个java程序启动时,就会产生一个进程,该进程会默认创建一个线程,在这个线程上会运行main()方法中的代码】
4 多线程程序
多段代码交替运行。 【看似是同时执行,其实和进程一样,由CPU轮流执行。】
5 线程的创建
1.继承Thread类 2.实现Runnable接口
6 后台线程
setDaemon(true)
新创建的线程默认都是前台线程。 【只要有一个前台线程在运行,这个进程就不会结束,如果一个进程只有后台线程运行,这个进程就会结束】
**7 线程的生命周期及状态转换 **
在Java中,任何对象都有生命周期,线程也不例外。 线程整个生命周期分为5个阶段:
8 线程的调度 JVM会按照特定的机制为程序中的每个线程分配CPU的使用权。这种机制被称为线程的调度。 在计算机中,线程调度有两种模型: 1.分时调度模型 2.抢占式调度模型 JVM默认采用抢占式调度模型,大多数情况下程序员不需要去关心它。
8.1 线程的优先级
线程的优先级用1~10之间的正数表示,数字越大优先级越高。 [处于就绪状态的每个线程都有自己的优先级] main线程具有普通优先级。(5) 【可以通过Thread类的setPriority方法对其进行设置】 8.2 线程休眠
sleep(long millis)
使正在执行的线程暂停,将CPU让给别的线程。这是可以使用静态方法sleep.(该方法让当前正在执行的线程暂停一段时间,进入休眠等待状态。) sleep方法声明抛出InterruptedException异常。因此在调用该方法时应该捕获异常。 注意:sleep时静态方法,只能控制当前正在运行的线程休眠。而不能控制其他线程休眠。 8.3 线程让步
yield()
和sleep类似,区别在于yield方法不会阻塞该线程。只是将线程转换成就绪状态。让系统的调度器重新调度一次。 【当某个线程调用yield()方法之后,只有与当前线程优先级相同或者更高的线程才能获得执行的机会】 8.4 线程插队
join()
当在某个线程中调用其他线程的join()方法时,调用的线程将被阻塞,知道被join()方法加入的线程执行完后它才会继续运行。
9 多线程同步 前提:多个线程去访问同一个资源时,会引发一些安全问题。 解决:实现多线程同步,即限制某个资源在同一时刻只能被一个线程访问。 9.1 同步代码块 Object lock = new Object(); 注意:锁对象的创建代码不能放到run()方法中。 9.2 同步方法 被synchronized修饰的方法在某一时刻只允许一个线程访问,访问该方法的其他线程都会发生阻塞,直到当前线程访问完毕后,其他线程才有机会执行方法。