进程和线程
一、引入
1.进程:每个独立执行的程序
4.多线程:在同一个进程(应用程序)中同时执行多个线程
二、区别:
2.线程:程序中维系运行的分支
举例:人操作系统,吃进程,线程:睁眼、用手拿、张嘴吃
3.多进程:在操作系统中同时运行多个程序
线程的状态
一、线程状态的分类
NEW:创建一个线程,比如MyThread mt=new MyThread();
RUNNABLE:可运行状态,比如mt.start();
WAITING/TIMED_WAITING:不可运行状态,比如MyThread.sleep();
BLOCKED:锁定状态,当前线程如果被解锁,还可以再次运行
TERMINATED:终止状态,线程体执行结束
二、设置线程的优先级
1.范围:1-10
java自带优先级参数
MAX_PRIORITY:10
MIN_PRIORITY:1
NORM_PRIORITY:5
2.方法
setPriority(int p)/getPriority()
线程的同步:
一、引入
当一个进程有多个线程时,每个线程都会抢占资源,此时会引发一系列问题,引入同步的概念,可解决这些问题
二、synchronized关键字
使用:
1.锁对象
synchronized(obj){...}或 synchronized(this){...}
2.锁方法:
修饰符 synchronized 返回值类型 方法名(){....}
死锁
一、引入
线程1锁住资源A 等待资源B,线程2 锁住资源B等待资源A,两个线程都在等待自己需要的资源,而这些资源被
另外的线程锁住,这些线程你等我我等你,谁也不愿意让出资源,这样死锁就产生了
解决:在定义锁时,也就是使用synchronized时,需要考虑当前资源被锁后,其他资源是否也同时被锁
生产者与消费者:
一、引入:
生产者将产品交给店员,而消费者从店员处取走产品,店员一次只能持有固定数量的产品,
如果生产者生产了过多的产品,店员叫生产者等一下,
如果店中有空位放产品了再通知生产者继续生产;
如果店中没有产品了,店员会告诉消费者等一下,
如果店中有产品了再通知消费者来取走产品。
容器类的线程安全:
方法:
List list = Collections.synchronizedList(new ArrayList());
线程的创建和启动
一、创建和启动的方式
方式1:继承Thread类
步骤:①创建一个类,继承Thread
②重写run方法,该手动导入
③使用Thread类对象调用start()方法启动
方式2:实现Runnable接口
步骤:①创建一个类,实现Runnable接口
②重写run()方法,自动提示
③创建一个Runnable子类对象,使用Thread构造器将该对象放入,初始化该Thread对象,调用start()方法
二、两种方式的比较:
三、注意:
1.Thread类在lang包下
2.程序启动后会创建两个线程,一个是垃圾回收器线程,一个是主线程,main()方法运行在主线程中
3.关于run()方法
①它是线程体,启动一个线程,会执行该方法内的代码
②启动线程时使用start()方法,此线程进入RUNNABLE状态
③在启动线程时不用调用run()方法,因为run()方法没有实现多线程机制
Thread类方法:
线程的调度:
一、调度方法:
1.线程睡眠:Thread.sleep(long millis) throws interruptedException 方法
使线程转到阻塞状态
millis参数设定睡眠的时间,以毫秒为单位
当睡眠结束后,就转为就绪(Runnable)状态
2.线程让步:
Thread.yield()方法
暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程
3.线程加入:
join()throws InterruptedException 方法
在当前线程中调用另一个线程的join()方法,则当前线程转入WAITING状态,
直到另一个线程运行结束,当前线程再由阻塞转为就绪状态
二、结束线程
1.使用标志位,较为常用
2.对于sleep或wait中的线程,使用interrupt()来终止线程