线程和进程有区别?
进程=加载上下文+执行程序+保存上下文
进程属于资源分配的最小单位,线程属于执行任务的最小单位。
线程6种状态:
1、New 尚未启动的线程的线程状态。
2、Runnable 可运行线程的线程状态,等待CPU调度。
3、Blocked 线程阻塞等待监视器锁定的线程状态。处于synchronized同步代码块或方法中被阻塞
4、Time_waiting 具有指定等待时间的等待线程的线程状态。下列带超时的方式:Thread.sleep、Object.wait、Thread.join、LockSupport.parkNanos、LockSupport.parkUntil
5、Waiting 线程等待的线程状态。
6、Temminate 终止线程的线程状态。线程正常完成执行或者出现异常。
终止线程-interrupt
如果目标线程在调用Object class的wait()、wait(long)或wait(long, int)方法、join()、join(long,
int)、join(long, int)、sleep(long, int)或sleep(long, int)方法时被阻塞。
此时线程被调用interrupt方法后,该线程的中断状态将被清除,抛出InterruptedException异常。
如果目标线程是被I/O 或者NIO中的Channel所阻塞,同样,I/O操作会被中断或者返回特殊异
常值。达到终止线程的目的。
如果以上条件都不满足,则会设置此线程的中断状态。
正确的线程中止-标志位,代码逻辑中,增加一个判断,用来控制线程执行的中止。
public class Demo4_FlatControl {
public volatile static boolean flag = true;
public static void main(String[] args) throws Exception {
new Thread(() -> {
try {
while (flag) {
System.out.println("运行中");
Thread.sleep(1000L);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}).start();
Thread.sleep(3000L);
flag = false;
System.out.println("程序运行结束");
}
}
线程的通讯方式:1、文件共享,2、网络共享 3、共享变量
线程间的协作方式:jdk提供的线程API 例如:suspend/resume wait/notify park/unpark