1,什么是进程什么是线程
进程:我的理解是进程就是一个程序,windons打开任务管理器就可以看到,java.exe或者javaw.exe就是java程序在windons里的一个进程。
线程:个人理解,程序里的多个并行的任务线,比如java里除了main主线程,还有你可以起几个task定时的线程用于处理其他事项。
2,线程
java方式:extends Thread类和implements Runnable接口
start()创建线程,run()只是执行进程
线程状态:创建,就绪,运行,阻塞,time waiting,wating,消亡。
上下文切换:对于单核cpu来说,cpu在一个时刻只能运行一个线程,当在运行一个线程的过程中转去运行另外一个线程,这个叫线程 的上下文切换(对于进程也类似)。上下文切换的目的就是储存和回复cpu状态的过程,它使得线程执行能够从中断点恢复执行。
Thread类:
Thread也是实现了Runnable接口的
(1)start():启动一个线程。
(2)run():run不需要用户来调用的,当通过start方法启动一个线程之后,线程获得cpu后便进入run方法执行具体任务,需要重写run方法
(3)sleep方法:
sleep(long millis) // 毫秒
sleep(long millis,int nm)//毫秒,纳秒
sleep相当于让线程睡眠,交出cpu,但是不会释放锁。
(4)yield方法:交出cpu,但是不会释放锁,不能控制具体交出cpu的时间,同时只能让拥有相同优先级的线程有去获得cpu的机会,调用yield不会让线程进入阻塞状态,而是让线程重回就绪状态,重新等待获取cpu时间,而sleep是会让线程阻塞。
(5)join方法
join()
join(
long
millis)
//参数为毫秒
join(
long
millis,
int
nanoseconds)
//第一参数为毫秒,第二个参数为纳秒
加入在Main线程中,调用thread.join方法,则main方法会等待thread线程执行完毕或者等待一定时间。就是说会抢资源。
实际上join是调用了wait方法,wait是会让线程进入阻塞的,并释放锁交出cpu,所以join也会释放锁。
(6)interrupt方法
中断,单独使用的话可以使处理阻塞的线程抛出一个异常,也就是说可以用于中断一个处于阻塞的线程。但是不能中断一个正在运行的线程。但是加上isInterrupted()可以中断正在运行的,但不介意直接用isInterrupted来标志中断,可以自定义一个标志,
(7)stop方法
已经废弃,因为不安全,stop会直接终止run方法运行,会完全释放锁,导致对象状态不一样。
(8)destroy方法:废弃
线程属性方法:
getId:得到线程id
getname和setName:得到线程名称和设置线程名称
getPriority和setPriority得到和设置优先级
setDaemon和isDeamon设置成为守护线程和判断是否是守护线程。
守护线程和用户线程的区别在于:守护线程依赖于创建它的线程,而用户线程则不依赖。举个简单的例子:如果在main线程中创建了一个守护线程,当main方法运行完毕之后,守护线程也会随着消亡。而用户线程则不会,用户线程会一直运行直到其运行完毕。在JVM中,像垃圾收集器线程就是守护线程。