多线程

来源:互联网 发布:什么牌子沙发好 知乎 编辑:程序博客网 时间:2024/06/11 22:22

1:进程和线程

1) 进程:系统分配资源和调用的独立的单位,正在运行的一个应用程序就是一个进程.

2) 多进程:多进程的意义就是提高CPU的使用率,

玩游戏的同时,也在听歌,这就是多进程,但是多进程不是在同时运行,只是CPU在两个进程之间进行高效的切换.

3) 线程: 线程是依附于进程,可以理解为是进程的一个子任务,一个进程有多个线程,就叫多线程程序.

4) 多线程: 多线程的意思是为了让每个线程抢占CPU的使用权.


2:Thread:

1) 创建一个类继承Thread类,然后实现run()方法,run()方法必须是耗时的,不然是没有意思.然后创建自定义的对象,调用start()方法,启动线程.

2) Thread的方法:

getName():得到当前线程的名字; setName(String name): 给线程设置一个名字,

static yeild();终止当前线程的执行权,让其他线程抢占CPU,

static currentThread();返回当前正在运行的线程,

static sleep(long millis);让线程休眠,millis是毫秒数,

join();让这个线程一直执行到结束,才能执行其他线程,

Daemon(boolean flag);把当前线程设置为守护线程,当剩下所有的线程都是守护线程时,jvm会停止运行,

getPriority();得到当前线程的优先级(1-10);优先级只是线程抢到CPU的几率变大,


3:Runnable:

1) 自定义类实现Runnable接口,然后实现run()方法,创建自定义类对象,然后将对象作为参数传到Thread的构造方法中,

创建出Thread的对象,调用start()方法,启动线程.

2) 模拟电影院卖票场景,加入了延迟,出现了问题,

a) 电影票出现了同票问题;   这个是由于CPU执行一次具有原子性操作!

b) 电影票出现了数量变多问题; 线程的执行具有延迟性和随机性!

3) 线程安全问题: 需要将对共享数据操作的语句,封装到一个独立的代码块中,用关键字:synchronized.

格式: synchronized( 锁对象 ) { ... }

锁对象:多线程所用到的锁对象必须是一致的;锁对象可以是Object类的对象,也可以是自定义类的对象.

如果一个方法中进去之后都是同步代码块,那么可以将这个方法定义为同步方法;同步方法的锁对象是this,如果方法是静态方法,则为当前类名.class

4) Lock:锁对象,Lock是一个接口,ReenTrantLock是它的实现子类,   Lock lock = new ReenTrantLock();

public void lock();加锁   public void unlock();释放锁 throws IllegalMonitorStateException

5) 等待唤醒机制:

由于同步中存在死锁问题:两个线程都在等待对方,

notify();唤醒当前正在等待的一个线程,wait();让这个线程处于等待状态,并且释放所有的锁.