线程是进程内的执行单元。更小调度单元。广泛运用。
分配进程给cpu内核运行。
java线程可用的状态:
*new(还没有开始工作,属于静态的。调用实例start启动方法后才正常被使用了)->
线程进入*runnable状态(表示已准备好了,待执行状态。)->
terminated(结束了。)->
#申请锁,申请监听器。比如synchrsnized 拿锁有可能会被阻塞住。blocked-挂起。
进入临界区会锁住,没有拿到锁,会被挂起。
#wait 进入等待状态。等待其他线程进行通知。切换回runnable状态继续执行。
1.无限期等待 2.有限期等待-比如10秒后自动苏醒。
start才是启动线程的方法。
start()函数就是调用这个run函数。
转一个runnable接口的实例进来 让它自动调用这个实例的run方法。
对象的锁。释放掉。
导致多线程数据的一致性。
读进来,读到我这个对象。
写完再读,加锁。
stop方法不推荐使用。
中断 寻求我 响应 打招呼 额外操作 中断停止线程
(后台某些逻辑可能是死循环写死 再去做某些操作 在某些场合需要我们
停止掉它。一调用它就结束了。很大一个循环体。读取某些数据库的
值 set到某些对象里边去 保证cpu的内核读到
)
public void run(){
while(true){
if(Thread.currentThread().isInterrupted()){
System.out.println("Interruted!");
break;
}
Thread.yield();
}
}
break跳出循环(这段方法体)就会自然终结 run方法
让一个线程停止工作 优雅方式。
thread.sleep(5000);会抛出一个异常
等的时候让其结束就结束。
挂起(suspend)和继续执行(resume)线程
– suspend()不会释放锁
– 如果加锁发生在resume()之前 ,则死锁发生
这两个方法不推荐使用不推荐使用的原因是。
{
jps
jstack xxxx线程数字
}
等待线程结束(join)(会等你一起走的含义。)和谦让(yeild)(静态方法 优先级不是特别高,让其他线程有机会争夺这个cpu。抢这个时间片 测试和调试时时会使用这个)
join的本质
while (isAlive()) {先判断线程是否已经结束。
wait(0);
}
0无限期等待 传递非0有限期等待。
thread里边不会调用notifyAll()是在java虚拟机中调用的。是使用c++代码去调用得。唤醒所有当前实例下等待的所有线程。
不要在Thread实例上使用 wait()和notify()方法。是因为它们会被系统调用的。你不好控制它。
什么是守护线程?是运行在系统后台,帮助系统做一些运维方面的工作。
在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT线程就可以理解为守护线程
当一个Java应用内,只有守护线程时,Java虚拟机就会自然退出
Thread t=new DaemonT();
t.setDaemon(true);//把一个线程设置成为一个守护线程。虚拟机就不会管它。
t.start();需要在开启前告知虚拟机。必须写在前面。
线程之间的同步。
synchronized(拿到对象的一把锁,或者监视器。)
– 指定加锁对象:对给定对象加锁,进入同步代码前要获得给定对象的锁。
– 直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。
– 直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁。
Object.wait() Obejct.notify()
分配进程给cpu内核运行。
java线程可用的状态:
*new(还没有开始工作,属于静态的。调用实例start启动方法后才正常被使用了)->
线程进入*runnable状态(表示已准备好了,待执行状态。)->
terminated(结束了。)->
#申请锁,申请监听器。比如synchrsnized 拿锁有可能会被阻塞住。blocked-挂起。
进入临界区会锁住,没有拿到锁,会被挂起。
#wait 进入等待状态。等待其他线程进行通知。切换回runnable状态继续执行。
1.无限期等待 2.有限期等待-比如10秒后自动苏醒。
start才是启动线程的方法。
start()函数就是调用这个run函数。
转一个runnable接口的实例进来 让它自动调用这个实例的run方法。
对象的锁。释放掉。
导致多线程数据的一致性。
读进来,读到我这个对象。
写完再读,加锁。
stop方法不推荐使用。
中断 寻求我 响应 打招呼 额外操作 中断停止线程
(后台某些逻辑可能是死循环写死 再去做某些操作 在某些场合需要我们
停止掉它。一调用它就结束了。很大一个循环体。读取某些数据库的
值 set到某些对象里边去 保证cpu的内核读到
)
public void run(){
while(true){
if(Thread.currentThread().isInterrupted()){
System.out.println("Interruted!");
break;
}
Thread.yield();
}
}
break跳出循环(这段方法体)就会自然终结 run方法
让一个线程停止工作 优雅方式。
thread.sleep(5000);会抛出一个异常
等的时候让其结束就结束。
挂起(suspend)和继续执行(resume)线程
– suspend()不会释放锁
– 如果加锁发生在resume()之前 ,则死锁发生
这两个方法不推荐使用不推荐使用的原因是。
{
jps
jstack xxxx线程数字
}
等待线程结束(join)(会等你一起走的含义。)和谦让(yeild)(静态方法 优先级不是特别高,让其他线程有机会争夺这个cpu。抢这个时间片 测试和调试时时会使用这个)
join的本质
while (isAlive()) {先判断线程是否已经结束。
wait(0);
}
0无限期等待 传递非0有限期等待。
thread里边不会调用notifyAll()是在java虚拟机中调用的。是使用c++代码去调用得。唤醒所有当前实例下等待的所有线程。
不要在Thread实例上使用 wait()和notify()方法。是因为它们会被系统调用的。你不好控制它。
什么是守护线程?是运行在系统后台,帮助系统做一些运维方面的工作。
在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT线程就可以理解为守护线程
当一个Java应用内,只有守护线程时,Java虚拟机就会自然退出
Thread t=new DaemonT();
t.setDaemon(true);//把一个线程设置成为一个守护线程。虚拟机就不会管它。
t.start();需要在开启前告知虚拟机。必须写在前面。
线程之间的同步。
synchronized(拿到对象的一把锁,或者监视器。)
– 指定加锁对象:对给定对象加锁,进入同步代码前要获得给定对象的锁。
– 直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。
– 直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁。
Object.wait() Obejct.notify()