进程
就是正在运行的程序。也就是代表了程序锁占用的内存区域。
特点
**独立性:**进程是系统中独立存在的实体,它可以拥有自己的独立的资源,每一个进程都拥有自己私有的地址空间。在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间。
**动态性:**进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合。在进程中加入了时间的概念,进程具有自己的生命周期和各种不同的状态,这些概念在程序中都是不具备的。
**并发性:**多个进程可以在单个处理器上并发执行,多个进程之间不会互相影响。
线程
线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以开启多个线程。
多线程扩展了多进程的概念,使得同一个进程可以同时并发处理多个任务。简而言之,一个程序运行后至少一个进程,一个进程里包含多个线程。如果一个进程只有一个线程,这种程序被称为单线程。如果一个进程中有多条执行路径被称为多线程程序
线程创建方式
继承Thread类
Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。Start()方法是一个native方法,它将通知底层操作系统,最终由操作系统启动一个新线程,操作系统将执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。
步骤
(1)创建线程类去继承Thread类
(2)重写Thread类的run方法,run方法中编写需要完成的任务
(3)创建线程类对象
(4)调用start方法启动线程
创建对象
Thread()//分配新的 Thread 对象。
Thread(String name)//分配新的 Thread 对象。
Thread(Runnable target)//分配新的 Thread 对象。
Thread(Runnable target,String name)//分配新的 Thread 对象。
常用方法
返回值 方法名 描述
long getId() 返回该线程的标识符。
String getName() 返回该线程的名称。
void run() 如果该线程是使用独立的 Runnable 运行对象构造的,
则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
void setName(String name) 改变线程名称,使之与参数 name 相同。
static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),
void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
void stop() 终止线程。
代码演示
//测试 Thread类
public class Test_Thread {
public static void main(String[] args) {
// 1,创建对象
MyThread t = new MyThread();// 新建状态
// 2,开启线程
// t.run();
t.setName("线程1");// 修改线程名
t.start();// 可运行状态
// 3,run()和start()有什么区别?
// run()和start()都能执行任务,但是run()执行时就只是一个普通的方法调用没有多线程并发抢占的效果
// --模拟多线程--
MyThread t2 = new MyThread();
// t2.run();
t2.setName("线程2");// 修改线程名
t2.start();
//4,多线程的执行结果具有随机性
}
}
// 1,继承Thread类,实现多线程编程
class MyThread extends Thread {
// 2,在多线程编程里,把所有的业务放入--重写的run()里--generate--override methods..
// --需求:重复的打印10次线程名称
@Override
public void run() {
// 运行状态
for (int i = 0; i < 10; i++) {
// fori
System.out.println(super.getName() + "---" + i);// getName()--获取线程名称
}
}// 结束状态
}
线程1---0
线程2---0
线程2---1
线程2---2
线程2---3
线程2---4
线程1---1
线程1---2
线程1---3
线程1---4
线程1---5
线程1---6
线程1---7
线程1---8
线程1---9
线程2---5
线程2---6
线程2---7
线程2---8
线程2---9
实现Runnable接口
Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run。使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中断。
步骤
(1)创建线程类实现Runnable接口
(2)线程类中实现Runnable接口的run方法
(3)通过Thread类创建线程对象。
(4)将Runnable接口的实现类对象作为实际参数传递给Thread类的构造器中。
(5)调用Thread类的start()方法启动线程
方法
void run()//使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。
代码演示
//测试 Runnable接口
public class Test_Runnable {
public static void main(String[] args) {
// 1,创建目标对象
MyRunnable target = new MyRunnable(