进程是程序的一次动态执行过程
比进程更小的执行单位,是进程中的一个单独的顺序控制流。
它是进程中的独立运行的子任务
线程拥有共享的进程资源
Java虚拟机允许应用程序同时执行多个执行线程,这在Java种叫做并发。
join()
是调用A线程来帮助完成任务join(long millis)
参数的意思是设置一个等待时间,超过这个时间就不再等待。
通过start()
启动线程后,系统自动调run()
方法来执行线程
因为java只能继承一个类,所以通过继承
Thread
的方法创建线程的方法不能再继承其他类,不适合资源共享
所以可以用到Runnable接口来创建线程,并且可以继承其他线程。
通过覆盖接口Runnable
接口run()
方法来创建线程体。
需要通过Tread
包装Runnable
实现对象来创建线程,因为除了Thead
其他方法种没有start()
方法,没法启动线程。
前两个方法都不能获取线程执行结果,JDK1.5以后就可以通过这两个接口来获取线程返回的结果
接口中只有一个call()
方法 ,他是线程执行体,具有返回值。
表示异步任务,用于对具体的Runnable
或者Callable
任务执行结果进行中断,查询是否完成,获取结果。
它是
RunnableFuture<V>
泛型接口的实现类,而RunnableFuture<V>
是Runnable
和Future
接口的子接口所以这个类可以作为
Runnable
被线程执行,同时也可以作为Future
得到Callable
的返回值
方法 | 作用 |
---|---|
FutureTask(Callable<T>callable) |
在运行时执行给定的Callable |
FutureTask(Runnable runnable,V result) |
在运行时执行给定的Runnable ,并安排get将在成功完成以后返回给定结果 |
Callable
来创建对象Thread
包装来执行线程FutureTask
对象的get()
来获取call()
的执行结果java程序至少有一个主线程,线程名为main
,系统会为它自动分配ID
,优先级为5
,它不需要run()
方法
线程随机启动,取决于操作系统,不取决于代码start()
顺序。
java中将线程分为6个状态,状态封装在
ThreadState
枚举中,这代表虚拟机的状态
线程在操作系统中执行的状态,线程可以分为7种状态
新建态(NEW)
创建线程但没有调用start()
就绪态也可称为可运行态(RUNABLE)
调用start()
方法以后
运行态
分配到CPU之后的状态
等待状态
调用wait()
方法线程就进入等待状态
notify()
或者notifyAll()
才能被唤醒notifyAll()
能唤醒所有线程休眠状态
调用sleep()
方法以后
阻塞状态
线程在运行状态下发出输入/输出请求
死亡状态
run()
方法执行玩完毕
线程启动--start()
方法
线程休眠--sleep()
方法
线程让步--yield()
方法
让当前线程放弃当前的cpu资源,让给其他任务去执行,但是放弃的时间不确定。
线程等待--wait()
方法
常用于线程同步
线程唤醒--notify()
、notifyAll()
方法
暂停线程
使用suspend()
来暂停线程,使用resume()
方法来恢复线程,但是方法不安全,JDK8以后停用
线程加入--join()
方法
join()
所在的线程再继续。线程状态检查--isAlive()
方法
结束线程
Thread.stop()
方法,但是不推荐用,已经被作废
以下有3种结束正在运行的线程方法
interrupt()
来中断方法 | 方法 |
---|---|
public final void setPriority(int new Priority) |
设置优先级 |
获取优先级 |
public final boolean isDaemon()
public final void setDaemon(boolean on)
如果on
为true
那么设置为守护线程
如果on
为false
那么取消设置守护线程
可以把一组线程作为单个对象进行统一处理和维护,可以对所有线程进行同时操作
方法 | 作用 |
---|---|
public ThreadGroup(String name) |
创建名为name的线程组对象 |
public ThreadGroup(ThreadGroup parent,String name) |
创建具有给定父组和名称的线程组对象 |
加入同步锁来避免在线程调用没有结束之前再被其他线程调用,保证数据准确性和唯一性
将
synchronized
关键字写在某段代码块之前,可以让代码块加上线程锁
synchronized(object){
//代码块
}
object
是对象锁,如果在类中代码段进行同步,可以使用this
使用
synchronized
关键字修饰方法,内置锁(java每个对象都有一个)可以保护整个方法。
内置锁默认为
this
[修饰符]synchronized<返回类型>方法名([参数列表]){
//方法体
}
他是
Lock
接口的实现类,继承并增加了方法
lock()
方法finally
子句中对锁对象执行unlock()
方法线程之间可以共享资源和数据,这需要Java中的一些机制来保证线程之间的协调运行
在同步机制下,线程使用了
wait()
以后就放弃运行资格,处于等待状态。通过调用nitify()
来唤指定等待线程(并不能确定唤醒哪个线程,这个由操作系统决定),通过这两个方法实现了线程之间的通信
JDK1.5之后
Condition
是一个接口,将wait
,notify
,notifyAll
替换成了Condition
接口对象,用Lock
代替了synchronized
方法和语句的使用。
通过
Lock
对象调用newCondition()
方法获得Condition
对象,通过Condition
对象的await()、signal()、signalAll()
方法来实现线程通信
Condition
对象Condition 对象名=Lock对象.newCondition();
Condition
接口中的方法await()/signal()
必须在lock.lock()
和lock.unlock()
之间Condition
和Object
的wait/notify
的对应关系
await()---wait()
signal()---notify()
signalAll()---notifyAll()
Lock
对象上可以有多个Condition
对象monitor
,任意对象都有,可以理解为一把锁,所以可以任意创造一个对象个两个对象通信。wait()
方法,必须获得这把锁。wait()
方法,那么当前线程就会让出这个对象的monitor
,然后进入等待状态。notify()
可以唤醒一个正在等待monitor
的线程,但是只能给一个线程,这个由操作系统决定。notifyAll()
可以唤醒所有等待monitor
的线程,但也只有一个线程能够得到对象的monitor
,也是由操作系统决定的monitor
,只有线程退出同步块或者取消了lock才能得到锁notifyAll()
即可原文:https://www.cnblogs.com/JMWan233/p/12102606.html