黑马程序员——多线程

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一、线程基本介绍

1.线程和进程的区别

(1)进程是系统进行资源分配和调度的一个独立单位
(2)线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位
(3)进程有独立的地址空间
(4)同一个进程中的线程没有独立的地址空间,它们共享地址空间;线程也有自己的堆栈和局部变量

2. 线程的调度和优先级问题

    A:线程的调度
        a:分时调度
        b:抢占式调度 (Java采用的是该调度方式)
    B:获取和设置线程优先级
        a:默认是5
        b:范围是1-10

3.线程创建方法

(1)继承Thread类,实现run方法

public class SubThread extends Thread{
    public void run(){
        for(int x = 0 ; x<100 ; x++){
            System.out.println("run..."+x);
        }
    }
}

(2)实现runnable接口,并用其初始化Thread对象

/定义类,实现Runnable接口,重写run方法
class TicketRunnable implements Runnable{
    public void run(){
        for(int x = 0 ; x<100 ; x++){
                System.out.println("run..."+x);
            }
        }
    }

public class ThreadDemo {
    public static void main(String[] args) {
        //创建Thread类对象,传递Runnable接口的实现类的对象
        TicketRunnable t = new TicketRunnable();
        Thread t0 = new Thread(t);
    }
}

4.Thread的主要方法

(1)run
(2)start:线程开始运行
(3)join:调用线程执行x.join(),表示调用线程等待x线程执行完
(4)sleep:当前线程休眠
(5)yield:当前线程出让CPU
(6)isInterrupted:是否处于中断状态
(7)interrupt:设置线程的中断状态
(8)interrupted:清除线程的中断状态
(9)setDeamon:设置是否守护线程
(10)setPriority:设置优先级

5.线程的生命周期

    A:新建
    B:就绪
    C:运行
    D:阻塞
    E:死亡

二、线程安全

(1)类的线程安全性:如果一个类在多线程的访问下,其状态是可以预测的,并且不需要额外的同步,那么这个类就是线程安全的类
(2)封装:封装限制了代码路径,使得线程安全更有可能
(3)组合:非线程安全类–>线程安全类;线程安全类–>非线程安全类

三、synchronized

(1)synchronized是Java的关键字,是线程同步的内部机制,简单、方便,但性能不高
(2)可用于方法声明,方法体内,静态初始化块等;synchronized若用于代码块,加锁的对象可以是普通的Object或XXX.class
(3)synchronized保证了线程的可见性和互斥性
(4)可见性:一个线程的执行结果可以被另一个线程所看到
(5)互斥性:在同一时间只能有一个线程进行被保护的代码块

同步解决线程安全问题
A:同步代码块
synchronized(对象) {
需要被同步的代码;
}
这里的锁对象可以是任意对象。
B:同步方法
把同步加在方法上。
这里的锁对象是this

C:静态同步方法
把同步加在方法上。

四、wait、notify、notifyAll

(1)是Object类的方法
(2)是Java内部的条件阻塞机制
(3)条件阻塞机制的三要素:锁、条件、等待队列
(4)wait使调用线程阻塞,并等待其他线程的唤醒或是中断、超时
(5)notify在等待队列中选择一个线程使之运行(线程饿死)
(6)notifyAll激活等待队列中所有的线程,并且只能有一个线程能运行成功,其余仍等待
(7)逻辑:

synchronized(lock) { //锁
if (xxxxxx) { //条件
lock.wait(); //等待队列
} else {
doLogic();
}
}

synchronized(lock) { //锁
doLogic();
if (xxxxxx) { //条件
lock.notifyAll(); //等待队列
}
}

五、interrupt、interrupted

(1)interrupt设置线程状态为中断状态
(2)interrupted清除线程的中断状态,返回清除前的值
(3)wait,join,sleep以及J.U.C中一些类如ArrayBlockingQueue支持中断,并且在中断时都抛出InterruptedException,并且清除中断状态
(4)要指出的是:不是因为在其他线程中调用了x.interrupt(),x线程执行中就一定会抛出异常;抛出的InterruptedException是因为,wait、sleep等方法在循环中检查了线程状态,当被设置为中断后,就会抛出异常,并清除中断状态
(5)线程InterruptedException的处理方法:
a)简单地抛到调用者,由调用者处理
b)保存中断状态(Thread.currentThread().interrupt()),由上层代码处理(如:线程池中某一线程的任务被用户取消)

你可能感兴趣的:(JAVA基础,多线程)