多线程笔记三(Java)

#上课笔记,仅自己看得懂

一 ,有关线程的一些状态:
二,线程控制-联合控制
三,后台线程

笔记一:

/*
*死锁:
*无法解决,只可避免
*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();
				
			}
		}
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值