一、并行与并发
并行:多个任务在同一个时间中【同时】执行。
并发:多个任务在同一时间段执行,但【不同时】执行。
在电脑中,一个CPU可以并发的执行多个程序。
二、进程与线程
进程:软件的一次运行就是一个进程。
线程:线程是进程中的执行单元,一个进程中可以有多个线程。
三、创建线程的方式及线程简单应用
1、继承方式
步骤
-
创建类继承Thread线程类
-
重写父类的run()方法,把多线程要执行的代码写在里面
-
在测试类创建子类的对象
-
调用start()方法开启新线程
代码演示
public class AAA extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程1: " + i);
}
}
}
public class Test {
public static void main(String[] args) {
//创建AAA的对象
AAA a = new AAA();
//调用方法(开启线程之后新线程会自动执行run()方法)
a.start();
//循环
for (int i = 0; i < 100; i++) {
System.out.println("线程main:" + i);
}
}
}
2、实现接口方式
步骤
-
创建子类实现Runnable接口
-
重写接口的run()方法,把线程要执行的代码写在里面
-
在测试类创建子类对象
-
创建Thread对象,把子类对象作为参数传入构造方法
-
调用start()开启线程
代码演示
public class BBB implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("新线程" + i);
}
}
}
public class Test03 {
public static void main(String[] args) {
//创建BBB对象
BBB b = new BBB();
//创建线程对象
Thread t = new Thread(b);
//调用方法
t.start();
//main方法执行的循环
for (int i = 0; i < 100; i++) {
System.out.println("main线程:" + i);
}
}
}
3、设置和获取线程名称
继承Thread时:
设置名称: setName();
获取名称: getName();
实现Runnable时:
设置名称: setName();
获取名字: Thread.currentThread().getName();
4、线程睡眠的方法
线程可以睡眠,
睡眠的意思就是不执行代码 可以让当前的线程睡眠指定的时间:
Thread.sleep(睡眠时间);
代码演示:
//让当前线程睡眠4秒钟
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
}
运行在哪个线程中,这部分代码就另哪一个线程进行睡眠。
5、匿名内部类与线程
匿名内部类的方式继承Thread类
public class Test04 {
/*
匿名内部类格式:
父类/接口 对象名 = new 父类/接口(){
重写方法
};
*/
public static void main(String[] args) {
//使用匿名内部类方式完成继承Thread
Thread t = new Thread(){
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("匿名内部类" + i);
}
}
};
//开启线程
t.start();
//main循环
for (int i = 0; i < 100; i++) {
System.out.println("main" + i);
}
}
}
匿名内部类的方式实现了Runnable接口
public class Test05 {
public static void main(String[] args) {
//匿名内部类
Runnable r = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("匿名内部类" + i);
}
}
};
//创建线程对象
Thread t = new Thread(r);
//开启线程
t.start();
//main循环
for (int i = 0; i < 100; i++) {
System.out.println("main" + i);
}
}
}