进程是系统中正在运行的一个程序,程序一旦运行就是进程。
进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法 访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。
是操作系统能够进行运算调度的最小单位。他被包含在进程之中,是进程中的实际运作单位。一个线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并执行不同的任务。
1.继承Thread类
2.实现Runnable接口
3.使用Callable和Future
1start()方法 来启动线程,真正实现了多线程运行。这是无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的Start()方法来启动一个线程,这是此线程是处于就绪状态,并没有运行。然后和通过此Thread类调用方法run()来完成其运行操作的,这里方法 run()称为线程题,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止。然后CPU在调度其他线程
2.run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,菜可继续执行下面的代码;程序中只要主线程----这一个线程,其程序执行 路径还是只有一条,这样就没有达到写线程的目的。
new创建一个Thread对象时,并没处于执行状态,因为没有调用start方法启动该线程,那么此时的状态就是新建状态。
线程对象通过start方法进入runnable状态,启动的线程不一定会立即得到执行,线程的运行与否要看cpu的调度,我们把中间状态叫可执行状态。
一旦cpu通过轮询或其它方式从任务可以执行队列中选中了线程,此时它采能真正的执行自己的逻辑代码。
线程正在等待获取锁。
进入BLOCKED状态,比如调用了sleep,或者wait方法
进行 某个阻塞的io操作,比如因网络数据的读写进入BLOCKED状态
获取某个资源锁,从而加入到该锁的阻塞队列中而进入BLOCKED状态
TERMINATED是一个线程的最终状态,在该状态下线程不会在切换到其它任何状态了,代表整个生命周期都结束了。
下面几种情况会进入TERMINATED状态:
线程运行正常结束,结束生命周期
线程运行出错意外结束
JVM Crash导致所有的线程都结束
System.out.println(Thread.currentThread().getName());
方法sleep()的作用是在指定的毫秒数内让当前的“正在执行的线程”休眠(暂停执行)。
可以看到表达的含义更清晰,更优雅。
run方法执行完成,自然终止
stop()方法,suspend()以及resume()都是过期作废方法,使用它们结果不可预期
大多数停止一个线程的操作使用Thread.interrupt()等于说给线程打一个停止的标记,此方法不回去终止一个正在运行的线程,需要加入一个判断才能可以完成线程的停止。
放弃当前cpu资源,将它让给其它的任务占用cpu执行时间。但放弃的时间不确定,有可能刚刚放弃,马上又获得cpu时间片
在操作系统中,线程可以划分优先级,优先级较高的线程得到cpu资源比较多,也就是cpu有限执行优先级较高的线程对象中的任务,但是不能保证一定优先级高,就先执行。
java的优先级分为1-10个等级,数字越大优先级越高,默认优先级大小为5。超出范围则抛出异常
线程的优先级具有继承性,比如a线程启动b线程,b线程与a线程优先级是一样的。
synchrozied关键字实现一个简单的策略来防止线程干扰和内存一致性错误,如果一个对象是对个线程可见的,那么对该想的所有读写都将通过同步的方式来进行。
可以用于对代码块或方法的修饰
普通同步方法 -----》锁的是当前实例对象
静态同步方法-------》锁的是当前类的Class对象
同步方法块----------》锁的是synchronized括号里配置的对象