什么是进程? ( 理解)
如果一次只能运行一个程序,那程序和程序运行是一个概念。因为它们是一一对应的。
什么是线城(必须掌握)
现在是一个程序被多个程序加载,那现在程序和程序运行就不是一个概念了。这就叫线城
或者说 : 一个程序从上往下按顺序执行,现在情况是,上面的代码没有执行完,而下面的代码抢到了CPU执行权,也运行了. 这就是多线程
为什么需要线程?(理解)
今天进程太麻烦了。进程太浪费资源,进程和进程之间的切换浪费时间,所以创造了线程
如果不理解进程,就不知道进程的缺点,不知道进程的缺点,就不知道什么是线城,他们是连在一起的。
进程就是一个程序在运行
线程的控制:
优先级控制
线城的休眠 ,让步,挂起和恢复
线城的串行话
现成的生命周期控制
线程同步:
线城的死锁
例子:
买票
生产和消费问题
多道程序的意思是:除了计算机操作系统之外,有多个用户程序,这些程序同时运行。
多道程序的特点:
1:间断性 如果a和b 2个程序同时运行,a还没有运行完,b就把执行权夺取然后运行
2:失去封闭性
3:不可再现性 重复执行一个程序,得到的结果总是不一样的
进程:程序一旦被运行,就叫进程。
进程是一个动态的实体,它有自己的生命周期,他因为创建而存在,因为调用而运行,因等待资源或事件而处理等待状态
因为完成任务而被撤消。
线程:是一个程序里有很多不同线路的执行。
多线程编程简单,效率高(能直接共享数据和资源,多进程不能)适合于开发web服务,聊天服务等
多线程:
第一个方法:继承thread类,重写父类的run方法 ,构造一个A对象,调用A对象的start方法 {start方法是从thread继承过来的}
注意:执行aa.start开启一个线程,并不代表他一定会执行run方法,只是抢到了cpu的执行资格,但是由于抢占cpu执行资格有很多线程,CPU不一定会执行aa所对应的线程。
第二个方法:如果一个实例类想要开启线程,可以实现Runnable接口。 类中必须定义一个run的无参数方法。
用多态的方法 : A a = new A(); //创建A 类对象a
Thread tt = new Thread(a); //利用a构造一个Thread对象tt
tt.start(); //调用tt中的start()方法
线程2种方式的区别:
继承Thread类,需要建立好多个实例对象. 而且成员都要加static 让对象共享一个数据 这个有点麻烦.
实现Runnable接口,只需要建立一个Thread对象,可以构造出多个线程,这些线程共享一个数据 最好用这个
Thread.setName(String name)
|--设置当前线程的名字
Thread.currentThread()
|--返回对当前正在执行的线程对象的引用
Thread.getName();
|--返回当前线程的名字
线程的控制:
1:优先级控制
|--线程优先级用数字来表示,范围从1到10
|--主线程的缺省优先级是5,子线程的优先级默认与其父线程相同。
2:线程的休眠和让步
|--就是让正在进行中的线程暂停执行,进入阻塞状态,带经过指定的延迟时间规定后,醒来之后转入到就绪状态。
|--Thread类提供相应的方法:
public static void sleep(long millis)
public static void sleep(long millis,int manos)
sleep()方法会抛出 InterruptedException异常,我们必须对其进行捕捉
|--线程的让步,也就是让出CPU,给其他线程执行的机会。
让运行中的线程主动放弃当前获得的CPU处理机会,但不是让该线程阻塞,而是让它转入就绪状态。
方法: public static void yield()
3:挂起和恢复
|--线程挂起:停止当前正在运行中的线程,使之进入阻塞状态,并不会自动恢复运行.
|--线程恢复:使一个已挂起的线程恢复运行.
Thread类提供的相关方法:
public final void suspend(); //暂停
public final void resume(); //重新取得
4:线程的串行话
|--在多个线程程序中,如果在一个线程运行的过程中要用到另一个线程运行结果,则可进行线程的串型化处理
这个方法比较好玩,想要在多线程中不受其他线程的阻塞,调用Thread.join()方法,在抛出异常即可。它没有执行完,后面的代码将不在运行.
方法:public final void join()throws InterruptedException
5:生命周期控制
|--如何结束一个线程
线程的同步:
|--synchronized 同步
|-- wait 等一等/ notify 通知 / notifyall 如果你们没有
final 修饰的方法,表示不能被重写
run方法不可以抛出异常:原因 重写方法抛出异常的范围不能大于被重写方法排除的异常范围
Synchronized同步关键字:
1:可以修饰一个方法
public void Synchronized run() 表示这个方法同步
2:可以修饰一个方法内部的某个代码块
class A
{
private int age=10;
public void run()
{
String i =new String ("哈哈");
while(true)
{
Synchronized(i) //同步代码块
{
if()........
}
{
}
}