Java线程学习和笔记——黑马训练营



1.关于线程的两种创建方式
1.1、Thread方法
创建线程的第一种方式,继承Thread类
步骤:
1.重写Thread类中的run方法 
2.然后在调用线程的start()方法
3. start()有两个作用:1.启动线程。2.调用run方法
class Demo extends Thread {
	private String name;
	//构造函数
	public Demo(String name){
		this.name=name;
	}
	public void run() {
		for (int i = 0; i < 80; i++) {
			// 打印线程名称
			System.out.println(Thread.currentThread().getName() + "-->" + i);
		}
	}
}

public class ThreadText {
	public static void main(String[] args) {
		//打印主函数线程名称
		System.out.println(Thread.currentThread().getName());
		// 创建线程
		Demo demo1 = new Demo("张三");
		Demo demo2 = new Demo("李四");
		// 启动线程
		demo1.start();
		demo2.start();
	}
}
1.2、Runnable方法
创建线程的第二种方式:实现Runnable接口
 步骤:
1.定义类实现Runnable接口
2.重写Runnable接口中的run方法
3.通过Thread类建立线程对象
4.将Runnable接口的之类作为实际参数传递给Thread类的构造函数
5.调用Thread类的start()方法启动线程并调用Runnable接口之类的run()方法
class Demo1 implements Runnable{
	private String name;
	//构造函数
	public Demo1(String name){
		this.name=name;
	}
	public void run() {
		for (int i = 0; i < 80; i++) {
			// 打印线程名称
			System.out.println(Thread.currentThread().getName() + "-->" + i);
		}
	}
	
}
public class RunableText {
	public static void main(String[] args) {
		//打印主函数线程名称
		System.out.println(Thread.currentThread().getName());
		Demo1 demo1=new Demo1("王五");
		Demo1 demo2=new Demo1("赵四");
		//创建Thread线程
		Thread t1=new Thread(demo1);
		Thread t2=new Thread(demo2);
		//启动线程
		t1.start();
		t2.start();
		
	}
}
实现Runnable接口方式和继承Thread方式有什么区别?
1.实现Runnable接口方式好处:避免了单继承的局限性
 在定义线程时,最好使用实现Runnable接口的方式。
2.实现Runnable接口线程代码存放在接口的之类的run()方法中
 继承Thread线程代码存放在Thread之类的run()方法中  

2.关于线程的生命周期

1.被创建状态:用new Thead类创建一个线程后,该线程处于被创建状态
2.运行状态:当线程对象调用了start()方法后,该线程处于就绪状态
3.冻结(阻塞)状态:当执行了sleep(),wait()后,或等待IO设备等资源,将让出CPU并暂停自己的运行,就处于冻结(阻塞)状态
4.死亡状态:当线程的run()方法执行完,或者被强制终止,那么该线程处于死亡状态。

3.关于多线程的同步synchronized(线程安全)
 多线程同时操作共享数据时,一个线程对多条语句只执行了一部分,还有完成执行完,然而另外一个线程抢占CPU执行权。会导致共享数据的错误。
 根据java API文档中对于多线程安全问题(阻塞状态),可以使用synchronized关键字。
 当代码块用synchronized修辞时,同步代码块保证内部内容只能有一个线程访问。
synchronized同步的使用
public void sync(){
		//同步锁的对象为this.
	synchronized (this) {
		//需要同步的内容
		}
	}
public synchronized void sync(){
		//同步方法
	}
在JDK1.5中提供了多线程升级解决方案,将同步synchronized替换成显示的Lock操作
class lockDemo{
	//初始化ReentrantLock对象
	private Lock lock1=new ReentrantLock();
	public void show(){
		//获取锁
		lock1.lock();
		try {
			//需要同步的内容
		} catch (Exception e) {
			
		}finally{
			//释放锁
			lock1.unlock();
		}
	}
}

4.关于多线程的死锁
 产生死锁的原因:当两个线程(使用synchornized关键字时)持有不同的锁,又同时需要访问对方的锁时,双方互不交换锁,就可能导致产生线程的死锁。
synchronized (this) {
	synchronized (this) {
		//同步嵌套			
		}
	}
当出现同步嵌套的时候,就有可能出现死锁的现象。

5.关于线程优先级
可以通过Thread对象.setPriority(1-10)设置优先级。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值