多线程,互联网必备知识,这里分3次分享
第一篇介绍多线程,如何实现多线程,以及多线程的几种状态
第二篇通过代码实现多线程各种状态
第三篇如何实现线程安全
进入正题
首先,弄清楚什么是线程,什么是进程
进程:运行中的程序,系统分配资源的最小单位
线程:可独立执行代码的子任务,系统执行代码的最小单位,进程中的代码总是由某个确定的线程执行
弄清楚这些了我们来看下如何创建线程,方法有两种
1.实现Runnable接口
2.继承Thread类(这里说下,其实Thread类也实现了Runnable接口)
给出代码之前,我们对比下这两种方法,他们都可以实现多线程,区别在于一个类只能继承一个类而可以实现多个接口,所以具体使用哪种方式创建线程,因情况而异,好了下面看代码:
线程1:
public class Thread1extends Thread{
private String msg;
public Thread1(String msg) {
super();
this.msg =msg;
}
public void doSomeThing(Stringmsg){
System.out.println("This is Thread1,message:"+msg+",threadName:"+Thread.currentThread().getName());
}
@Override
public void run() {
doSomeThing(msg);
}
}
线程2:
public class Thread2 implements Runnable{
private String msg;
public Thread2(String msg) {
super();
this.msg =msg;
}
public void doSomeThing(Stringmsg){
System.out.println("This is Thread2,message:"+msg+",threadName:"+Thread.currentThread().getName());
}
@Override
public void run() {
doSomeThing(msg);
}
}
测试类:
public class Main {
public staticvoid main(String[] args) {
Thread1 myThread1 =new Thread1("hello wordl 1!");
myThread1.start();
Thread2 myThread2 =new Thread2("hello world 2!");
Thread newThread =new Thread(myThread2);
newThread.start();
Thread2 myThread3 =new Thread2("hello world 3!");
myThread3.run();
}
}
打印结果为:
This is Thread1,message:hello wordl 1!,threadName:Thread-0
This is Thread2,message:hello world 3!,threadName:main
This is Thread2,message:hello world 2!,threadName:Thread-1
这些没什么特殊要解释的,直接看打印的后半句,我打印了执行线程的名字,大家可以看到myThread2和myThread3打印的线程名字不同,这是由于myThread3是在main方法中执行的run方法,因此执行它的线程是main线程
接下来说一下线程的几种状态,这个面试时候经常会问,注意一定不要打错,基础题
我们通过Thread类的源码可以看到有这么一个叫State的枚举,里面有如下几种状态:
NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED
线程生命周期会经过以下阶段
新建------就绪&运行------死亡
其中就绪和运行可以相互转换,例如线程调用Thread.yield();方法
而运行期间 线程也可能发生 阻塞
发生阻塞可能因为 有锁没有释放,除了阻塞还可能进入睡眠状态,比如调用了sleep方法
我们在下一篇分享中,会用代码给大家掩饰这六种状态