多线程(一)

来源:互联网 发布:慈禧为什么杀光绪 知乎 编辑:程序博客网 时间:2024/06/05 20:16

多线程,互联网必备知识,这里分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());}@Overridepublic 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());}@Overridepublic 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


有兴趣的同学也可以自己考代码试一下,这里可以看到Thread1继承了Thread类,而Thread2实现了Runnable接口,并且他们都重写了run方法,而在创建线程的时候,也有少许不同

这些没什么特殊要解释的,直接看打印的后半句,我打印了执行线程的名字,大家可以看到myThread2和myThread3打印的线程名字不同,这是由于myThread3是在main方法中执行的run方法,因此执行它的线程是main线程

接下来说一下线程的几种状态,这个面试时候经常会问,注意一定不要打错,基础题

我们通过Thread类的源码可以看到有这么一个叫State的枚举,里面有如下几种状态:

NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED

线程生命周期会经过以下阶段

新建------就绪&运行------死亡

其中就绪和运行可以相互转换,例如线程调用Thread.yield();方法

而运行期间 线程也可能发生 阻塞

发生阻塞可能因为 有锁没有释放,除了阻塞还可能进入睡眠状态,比如调用了sleep方法

我们在下一篇分享中,会用代码给大家掩饰这六种状态








原创粉丝点击