进程
进程:什么事进程?就是正在执行的应用程序,正执行的应用程序,他里面要执行很多任务,那么每一个任务,我们就可以称之为一个线程。
QQ音乐开启之后就是一个进程,他既可以下载歌曲,也可以听歌曲。那么这两个操作就是两个线程在执行。
一个进程里面,至少要包含一个线程。
什么是并发什么是并行
简而言之就是并发是多个事件在同一时间段执行,而并行是多个事件在同一时间点执行。
打个比方。并发,就像一个人(cpu)喂2个孩子(程序),轮换着每人喂一口,表面上两个孩子都在吃饭。并行,就是2个人喂2个孩子,两个孩子也同时在吃饭。
创建一个新的线程
线程要依赖于进程,进程是拥有资源的基本单位,线程是CPU调度的基本单位
线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
创建接口的三种方法
第一种是 extends Thread 然后重写run方法,然后创建该类的对象,再调用start方法
创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动
MyRunable myRunable = new MyRunable();
Thread th = new Thread(myRunable,“王菲”);
th.start();
第三种创建一个类实现Callable 接口, 创建一个FutureTask类将Callable接口的子类对象作为参数传进去,创建Thread类, 将FutureTask对象作为参数传进去,开启线程
MyCallable myCallable = new MyCallable();
FutureTask<Integer> integerFutureTask = new FutureTask<>(myCallable);
Thread th = new Thread(integerFutureTask);
th.start();
//获取线程执行完之后,返回的结果
Integer integer = integerFutureTask.get();//通过get方法获取到线程的返回值
System.out.println(integer);
出现线程安全问题的三个条件
1.是否是多线程环境
2.是否有共享数据
3.是否有多条语句在操作这个共享数据
同步锁
synchronized (锁对象){ //锁对象:可以传任意的所对象
//需要被同步的代码
}
静态同步方法的锁对象是当前类的字节码文件对象的锁对象是当前类的字节码文件就是 类名.class
方法锁的锁对象就是this
Lock锁的概念
虽然我们可以理解同步代码块和同步方法的锁对象问题,
但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,
为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock
B:
Lock和ReentrantLock
void lock ()
void unlock ()*/
Lock lock = new ReentrantLock();
lock.lock(); //加锁
/*
需要被同步的代码
*/
lock.unlock(); //释放锁
将不安全的集合转换为安全的集合
List list = Collections.synchronizedList(new ArrayList());
死锁
两个或者两个以上的线程, 在抢占CPU的执行权的时候, 都处于等待状态
线程中的一些方法
Thread.sleep(5000); //让线程睡眠当前毫秒值
th1.interrupt();//打断线程的阻塞状态,让线程继续运行
加入线程:
public final void join ()
意思就是:等待该线程执行完毕了以后, 其他线程才能再次执行
注意事项:线程启动之后, 在调用方法
Thread.yield();//线程礼让
守护线程:
public final void setDaemon ( boolean on):
将该线程标记为守护线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。
该方法必须在启动线程前调用。
当用户线程,执行完之后,那么守护线程,必须里面死亡