#上课笔记,仅自己看得懂
一 ,有关线程的一些状态:
二,线程控制-联合控制
三,后台线程
笔记一:
/*
*死锁:
*无法解决,只可避免
*jvm不检测,也不避免,所以程序源要避免不发生死锁
*Thread类:
*suspend()
*resume()两个方法已被弃用,会导致死锁
*
*如何避免死锁:
*保证每一个线程按一定的顺序去访问
*
*线程阻塞:有人把阻塞状态,等待状态,计时状态合成为阻塞状态
*
*线程生命周期:线程从出生到死亡的过程
*
*/
笔记二:(分析线程生命周期的状态)
import javax.print.attribute.standard.MediaSize.Other;
class other extends Thread{
public void run() {
super.run();
System.out.println("start !");
}
}
public class RunnableDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("begiin");
other other=new other();
other.start();
// other.start();只能启动一次,否者报错
/*
*
* 新建new
* 使用new创建线程对象,仅仅在堆中分配内存空间,
* 再调用start方法前,新建状态下,线程没有启动,
* 仅仅是线程对象
*
*
* 可运行状态
*1)ready就绪状态,线程对象调用start后等待jvm调度,(此时线程没有 运行)
*
*2)running运行状态,线程对象获得jvm调度,如果存在多个cpu,允许多个线程并行运行
*
*阻塞状态:
*正在运行的线程遇到因为魔种元婴放弃cpu
*暂停运行,就会进入阻塞状态
* *等待状态:
*只能被其他线程唤醒,使用的是无参数的wait方法
*1)当县城处于运行过程时调用了wait方法
*此时jvm把线程存在对象等待池
*2)当前线程进入sleep状态
*
*计时等待状态:
*此时 使用带参数的wait方法
*1)调用wait(long time)
*2)调用sleep(long time)
*
*终止状态:
*即表示线程终止
*1)执行完run方法而退出
*2)出现异常退出(意外终止)
*
*/
}
}
笔记三:(线程休眠)
public class SleepDemo {
/*
*
* 线程休眠:
*
* 让执行的线程暂停一会,进入计时等待时间
* sleep(long millis)
* 调用sleep后,当前线程放弃cpu
* 该方法用于模拟网络延迟,
* 让多线程并发同一个资源的错误效果更佳明显
*
*
*
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=10;i>0;i--) {
System.out.println("还剩"+i+"秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("boom!");
}
}
笔记四:(线程控制-联合控制)
class join extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
for(int i=0;i<50;i++) {
System.out.println("join"+i);
}
}
}
public class JoinDemo {
/*
* 线程的join方法,表示一个线程等待另一个线程 完成后 才执行,join方法被调用后线程对象出现阻塞状态
* 称为联合线程,就是当前线程和当前所在的线程
*
*
*/
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
System.out.println("begin..");
join joinThread=new join();
for(int i=0;i<50;i++) {
System.out.println("main"+i);
if(i==10) {
joinThread.start();
joinThread.join();
//表示一个线程等待另一个线程 完成后 才执行,
}
// if(i==20) {
// joinThread.start();
// }
}
System.out.println("end....");
}
}
笔记五:(后台线程)
/*
* 在后台运行,目的是为其他线程提供服务,也称”守护线程“
* 列如:jvm的GC
*
* 特点:
* 所有前台线程结束,后台线程才结束
*
* 测试是否为后台线程的办法:
*Thread.isDaemon()
*
*前台线程创建的线程默认是前台线程
*可以通过setDaemon()方法设置为后台线程
*
* 设置为后台线程必须在start前调用
*
* 自学:
* 线程的优先级
* 线程的礼让
* 定时器和线程组
*
*
*/
//
class DaemonThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
for(int i=0;i<50;i++) {
System.out.println(super.getName()+" "+super.isDaemon()+i);
}
}
}
public class DomeThread {
public static void main(String[] args) {
// TODO Auto-generated method stub
//不能设置主线程为后台线程
//Thread.currentThread().setDaemon(true);
//测试是否为后台线程
System.out.println(Thread.currentThread().isDaemon());
for(int i=0;i<50;i++) {
System.out.println("main"+i);
if(i==10) {
DaemonThread thread=new DaemonThread();
thread.setDaemon(true);
thread.start();
}
}
}
}