程序:是一组指令的集合 静态的
进程:正在运行的程序 动态的 有自己的独立空间
线程:进程的单一执行流 只能共享进程的空间
一个进程对应一个程序,一个程序对应多个进程;
一个线程对应一个进程,一个进程对应多个线程;
多线程的优点:同时并发执行多个任务,提高CPU的利用率
如何实现多线程:
继承Thread类:1:extends Thread
2:内部类 Thread thread=new Thread();
实现Runnable接口:implements Runnable;
线程的生命周期:
线程的状态:
新建 new 分配内存
就绪状态 获得CPU使用权
运行状态 执行run方法 占用CPU
阻塞状态 放弃CPU 重新就绪
死亡状态 run方法执行完之后死亡
sleep()、yield()、join()是Thread类的静态方法,都会使当前处于运行状态的线程放弃CPU,sleep()给其他运行线程的机会,但不考虑其他线程的优先级,但yield()只会让位给相同或更高优先级的线程,当线程执行sleep()方法后将转到阻塞状态,而执行yield()方法后将转到就绪状态,前者有可能抛出异常,后者没有。一般情况下,建议使用sleep()方法;join()方法用于等待其他结束,当前运行的线程可以调用另一线程的join()方法,当前运行线程将转到阻塞状态,直到另一线程结束他才会恢复好;
例:
public class Threads extends Thread{};
public class Threads implements Runnable{};
public class Thread{
public static void mian(String[] args){
Thread t1=new Thread(){
public void run(){
//要做的事
}
};
}
}
后台线程:
后台线程是指为其他线程提供服务的线程,也称为守护线程或者精灵线程;
后台线程的特点:
与前台线程相伴相随,只有所有前台线程都结束生命周期,后台线程才会结束生命周期。
要将某个线程置为后台线程的话,必须在它启动之前调用setdaemon()方法。
默认情况下 由前台线程创建的线程仍是前台线程,由后台线程创建的线程仍是后台线程,例如:Java虚拟机的回收站
线程的同步、阻塞和异步(粗略):
同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,获取线程的对象锁,可以保证在同一时刻只有一个线程能够进入临界区,并在这个锁被释放之前,其它线程都不能进入临界区。
实现方法:同步方法 同步代码块
异步:通过状态通知来通知调用者或回调函数来处理这个调用;
阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,函数只有在得到结果之后才会返回;
非阻塞:指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
注:同步是一个过程,阻塞是线程的一种状态,线程同步不一定会发生阻塞