java并发编程
1、什么叫线程?
一个程序执行多个任务,通常每一个任务成为一个线程。可以同时运行一个以上线程的程序称为多线程程序。
线程与进程的区别:
本质区别在于进程拥有自己的一整套变量,而线程则共享数据。
与进程相比,线程更加轻量级,创建和销毁一个线程的开销比进程小很多。
线程可能会不安全。
实际应用举例:一个web服务可能要并发处理多个请求。一个浏览器可以同时下载多个几幅图片。
javase 1.5后多线程发生了重大变化,增加很多接口和类。
2、线程的创建方法:
1、实现Runnable接口。
2、继承Thread类。
注意:不要调用Thread类或Runnable接口的run方法。因为直接调用run方法,只会执行同一个线程中的任务,而不会启动线程。应该调用Thread.start方法。这个方法将创建一个执行run方法的新线程。
3、中断线程
常用方法:
//向线程发送中断请求,将线程中断状态标记为true。如果目前该线程被一个sleep调用阻塞,将抛出InterruptedException 异常。
void interrupt(){}
//静态方法,判断当前线程是否被中断,会将线程的中断状态标记为false
static boolean interrupted(){}
//实例方法,判断当前线程是否被中断
boolean isInterrupted(){}
//静态方法,返回代表当前执行线程的Thread对象
static ThreadcurrentThread(){}
中断线程的作用是为了实现多线程,在该线程中断其他线程获得运行机会。
4、线程的几种状态
创建new,可运行Runnable,被阻塞Blocked,等待waiting,计时终止Timed waiting,被终止Terminated
被阻塞和等待线程。
什么时候有可能变成阻塞状态?
当一个线程试图获取一个内部的对象锁,而该锁被其他线程所拥有,则该线程进入阻塞状态。
当线程等待另一个线程通知调度器一个条件时,它自己进入阻塞状态。
有几个方法有一个参数超时,调用他们导致线程进入计时等待。
线程的终止:
run方法正常执行退出而死亡。
因为一个没有捕获的异常终止了run方法而意外死亡。
线程属性:线程优先级,守护线程,线程组
什么叫守护线程?
守护线程
setDaemon(Boolean f)守护线程的唯一作用就是为其他线程提供服务的。
线程组是一个可以统一管理的线程的集合。默认的情况下创建的所有的线程属于相同的线程组。
对象锁
同步的作用保证数据正确性和一致性。两个线程或两个以上线程要共享对同一数据的存取。java语言提供了Synchronized关键字,并在1.5后引入了ReentrantLock。在执行一段代码前,会给它加上对象锁。别的同步线程如果要运行,必须得等当前线程运行完,才能顺利运行。
同步方法和同步代码块的区别:
同步方法是粗粒度的:
即有synchronized关键字修饰的方法。
由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,
内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
同步代码块是细粒度的:
即Synchronized关键字修饰的代码块。
被该关键字修饰的语句块会自动被加上内置锁,从而实现同步。
条件对象
条件对象个人的理解是为了实现某些特定条件下同步,而做出的努力。通过别的线程的一些状态变化,来满足本线程的条件,从而继续运行本线程。