再爱不回头。可如果是你,那就让我回头下吧。
最近在项目中使用了多线程,初次体验效果还是很不错的,所以有有必要学习下和记录下,虽然以前是学过一段时间,但是主要是对付面试,就没有很深入的进入学习,所以这次是深入进去学习下多线程的。这篇文章主要就是记录下线程的基本信息。个人认为,多线程是我们必须学的,同时也是必须要学好的部分。
线程的状态说明 :
1 : 新建状态(New) : 线程对象被创建后,就进入了新建状态。
比如 : Thread trhead = new Thread(); 代码就是这样理解
2 : 就绪状态 (Runnable): 就绪状态也可以称为: 可执行状态。线程对象创建后,其他线程调用了该对象的start()方法,来启动线程.
比如 : thread.start(); 就是主线程来调用thread对象的start方法,就是处理就绪状态,随时都可能被CPU调度执行.
3 : 运行状态 (Running): 线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。
4 : 阻塞状态 (Blocked): 阻塞状态是线程因为某种原因放弃CPU使用权,暂停使用权,直到线程进入到就绪状态,才有机会转到运行状态.阻塞的状态有如下的几种 :
4.1 : 等待阻塞 : -- 通过调用线程的wait()方法,让线程等待某工作的完成.
4.2 : 同步阻塞 : 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。(synchronized会在后续说到,同一个对象,synchronized修改的多个方法,只有一个方法在同一时刻是可以调用的,其他的线程都会被阻塞起来,如果没synchronized修饰的方法就不会进行阻塞.)
4.3 : 其他阻塞 : 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5 : 死亡状态(Dead) : 线程执行完了或者因异常退出了run()方法,该线程结束了生命周期。
如下是线程状态的图片说明
2 : 实现线程的方法有
2.1 : 直接继承Thread : 代码如下
package com.yang.create;
/***********************************************************************
*<PRE>
*
* File Name : 创建线程的方式一 ; 继承Thread 实现run方法
*
* Creation Date : 19-9-12
*
* Author : Gavin
*
* Purpose :
*
* History :
*
*</PRE>
***************************************************************************/
public class CreateThreadFunctionOne extends Thread {
public CreateThreadFunctionOne(String name){ super(name); }
@Override
public void run() {
for(int i=0;i<20;i++){
System.out.println(this.getName() + " : " + i);
}
}
public static void main(String[] args) {
for(int i=0;i<5;i++){
new CreateThreadFunctionOne("Thread Number : " + i).start();
}
}
}
2.2 实现 Runnable 接口 : 代码如下
package com.yang.create;
/***********************************************************************
*<PRE>
*
* File Name : 创建线程方法二
*
*
* Creation Date : 19-9-12
*
* Author : Gavin
*
* Purpose : 实现 Runnable接口,重写run方法
*
* History :
*
*</PRE>
***************************************************************************/
public class CreateThreadFunctionTwo implements Runnable {
@Override
public void run() {
for(int i=0;i<20;i++){
System.out.println(Thread.currentThread().getName() + " Number : " + i);
}
}
public static void main(String[] args) {
for(int i=0;i<5;i++){
CreateThreadFunctionTwo createThreadFunctionTwo = new CreateThreadFunctionTwo();
new Thread(createThreadFunctionTwo,"thread : " + i).start();
}
}
}
Thread 和 Runnable 的相同点:
都是实现多线程的方式
Thread 和 Runnable 不同点是 :
Thread 是类,Runnable 是接口,Thread类本身是实现了Runnable 类的接口。
我们知道“一个类只能有一个父类,但是却能实现多个接口”,因此Runnable具有更好的扩展性。
此外,Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源。
通常,建议通过“Runnable”实现多线程!