一、线程概述
1、进程的概念:
1.1、从用户的角度:
进程就是运行的程序
程序是静态的
进程是动态的
1.2、从操作系统的角度:
进程是操作系统资源分配的最小单位。进程是程序的一次执行过程,对应了从代码的加载、执行到执行结束这样一个完整的过程,也是进程从产生、发展到消亡的过程。进程的资源是隔离的,也就是说A不能访问B的资源,B也不能访问A的资源。
2、线程的概念:
线程是操作系统调度的最小单位。线程是比进程更小的执行单元,单个进程的执行可以产生多个线程。每个线程都有独立的生命周期,同一个进程中的线程共享同样的内存空间,并通过共享的内存空间来达到数据交换、通信和同步等工作。在基于线程的多任务处理环境中,线程是执行特定任务的最小单位。且一个进程至少要有一个线程。
线程&进程的区别
1、进程是操作系统资源分配的最小单位,线程是操作系统调度的最小单位
2、一个进程,至少要有一个线程
3、进程之间的资源,是互相隔离的,一个进程下的不同线程,是共享资源
4、一个程序崩溃,不会导致其他程序崩溃
二、线程的创建
1、继承Thread类
Thread类是Java语言包中的一个可重用类。Thead对象代表Java程序中单个的运行线程。Thread 实现了Runnable接口,Runnable 接口定义run( )方法,Thread的该方法中包含了运行时执行的代码。一个类通过继承Thread 类,同时重写其run( )方法,该类就可以实现多线程的方式运行,并继承Thread类的所有方法。通过实例化自定义的Thread类,使用start()方法启动线程。Thread 类提供了丰富的线程控制方法,为灵活地控制线程提供了方便。
import java.lang.*;
//继承Thread,重写run()
class MyThread extends Thread{
@Override
public void run() {
System.out.println("hello thread"); // 通过线程实现打印hello thread
try {
Thread.sleep(1000); //线程睡眠1秒,这期间不执行
} catch (InterruptedException e) { //捕捉异常
throw new RuntimeException(e);
}
}
}
public class Z{
public static void main(String[] args) {
Thread thread = new MyThread();
thread.start(); //启动线程
}
}
其结果为
hello thread
2、实现Runnable接口
线程创建还可以通过实现Runnable接口。
由于Java中不支持多继承性,所以如果用户需要自定义类以线程方式运行并且继承其他所需要的类,此时可以通过实现Runnable接口的方式使用线程。事实上,Thread类本身就实现了Runnable接口。Runnable接口只有一个方法run()。通过重写run()方法完成所需要的线程功能。
import java.lang.*;
//通过实现Runable接口,创建线程
class MyRunnable implements Runnable{
@Override
public void run() { //重写run()方法
System.out.println("my runnable");
}
}
public class Z{
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start(); //启动线程
}
}
运行结果为
my runnable
方法二与方法一不同点在于要实现Runnable接口,必须实现run()方法,否则将不能通过编译。而继承Thread类的线程机制则不一定要重载其run()方法,线程类将自动调用其基类的run()方法。