1、进程与线程区别
进程
进程(process)指一个程序的一次执行过程。编写一段简单代码并执行:
package com.zzu.test;
public class Test1 {
public static void main(String[] args) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
此程序执行完成大概需要10秒,在执行期间我们打开任务管理器查看:
执行完成后:
进程消失。
线程
线程(thread)又称为轻量级进程,线程是一个程序中实现单一功能的一个指令序列,是一个程序的单个执行流,存在于进程中,是一个进程的一部分。
package com.zzu.test;
import java.util.Date;
public class Test {
public static void main(String[] args) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
TimeThread timeThread = new TimeThread();
timeThread.start();
}
}
//1、自定义一个线程类,继承自Thread,2、重写Thread中的run方法————线程类
class TimeThread extends Thread{
@Override
public void run() {
System.out.println(new Date());
try {
sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
执行上述代码查看任务管理器:
10秒后线程增加1。
区别
- 一个进程可以包含多个线程,而一个线程必须在一个进程之内运行;同一进程中的多个线程之间采用抢占式独立运行;当一个进程结束,其中的线程也就结束,此外,一个进程没有可执行的线程,进程也结束。
- 线程有独立的执行堆栈、程序计数器和局部变量;但是没有独立的存储空间,而是和所属进程中的其它线程共享存储空间。
- 操作系统将进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的速度。
2、如何创建线程
1、继承java.lang.Thread类,重写run方法
package com.zzu.test;
public class Test1 {
public static void main(String[] args) {
CounterThread counterThread = new CounterThread();
counterThread.start();
}
}
class CounterThread extends Thread {
public CounterThread() {
super("计数器线程");//设置线程名称
}
public void run() {
try {
for (int i=1; i<=10; i++) {//输出10次,每次间隔0.5秒
System.out.println(this.getName()+"运行第"+i+"次");
Thread.sleep(1000);//使当前正在执行的线程休眠
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果:
2、实现java.lang.Runnable接口,实现run抽象方法
package com.zzu.test;
public class Test1 {
public static void main(String[] args) {
CounterThread counterThread = new CounterThread();
Thread thread = new Thread(counterThread);
thread.start();
}
}
class CounterThread implements Runnable{
public void run() {
String thisName = "计数器线程";
try {
for (int i=1; i<=10; i++) {//输出10次,每次间隔0.5秒
System.out.println(thisName+"运行第"+i+"次");
Thread.sleep(1000);//使当前正在执行的线程休眠
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果:
3、线程生命周期
Java中,线程有5种不同状态,分别是:新建(New)、就绪(Runable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。它们之间的转换图如下:
-
新建——>就绪
线程实例调用start()方法 -
就绪——>运行
线程获得CPU使用权 -
运行——>死亡
a、run方法执行完成
b、Error,程序本身无法恢复的严重错误
c、Exception,程序出现异常 -
运行——>就绪
线程失去CPU使用权 -
运行——>阻塞
a、sleep()
b、IO阻塞(比如让线程拷贝大的文件)
c、等待同步锁
d、wait()
e、suspend() -
阻塞——>就绪
a、sleep时间到
b、IO方法结束(比如文件拷贝完成)
c、获得同步锁
d、notify()
e、resume()