Java线程学习和笔记——黑马训练营
2015-10-21 15:17
645 查看
-------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!-------
1.关于线程的两种创建方式
1.1、Thread方法
创建线程的第一种方式,继承Thread类
步骤:
1.重写Thread类中的run方法
2.然后在调用线程的start()方法
3.start()有两个作用:1.启动线程。2.调用run方法
1.2、Runnable方法
创建线程的第二种方式:实现Runnable接口
步骤:
1.定义类实现Runnable接口
2.重写Runnable接口中的run方法
3.通过Thread类建立线程对象
4.将Runnable接口的之类作为实际参数传递给Thread类的构造函数
5.调用Thread类的start()方法启动线程并调用Runnable接口之类的run()方法
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同步的使用
4.关于多线程的死锁
产生死锁的原因:当两个线程(使用synchornized关键字时)持有不同的锁,又同时需要访问对方的锁时,双方互不交换锁,就可能导致产生线程的死锁。
5.关于线程优先级
可以通过Thread对象.setPriority(1-10)设置优先级。
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)设置优先级。
相关文章推荐
- eclipse快捷键
- EL显示List里嵌套map(Spring MVC3)返回的model
- java exception
- Spring3 MVC请求参数获取的几种方法
- Java注解简述
- JavaWeb_利用Cookie技术实现自动登录
- Task not serializable:java.io.NotSerializableExceptionon
- Java动态代理
- Java核心技术第12章(3)
- spring mvc 和 jstl
- Java F-bounded
- Java笔记集合
- springMVC 使用jstl
- struts2+spring整合框架
- JavaWeb_利用Session实现简易购物车
- struts2添加需要的jar包
- struts2+spring整合框架
- thinking in java 笔记之初始化和清除
- java开源类库pinyin4j的使用
- 首次整合struts2+spring 提交表单后报的500错误