进程与线程
进程: 指在内存中运行的应用程序, 每个进程在内存里拥有自己的内存空间
线程: 线程是进程中的执行单元, 负责当前进程中程序的执行(真正干事的是线程)
简而言之: 一个应用程序运行后至少有一个进程, 一个进程可以包含多个线程
并发与并行:
-
-
并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的
Thread 类
java 线程属于抢占式调度, 哪个线程的优先级高, 哪个线程优先执行, 同一个优先级, 随机执行
多个线程之间互不影响 (???这里还不够具体)
创建线程的两种方法:
-
-
实现 Runnable 接口的类, 然后实现 run 方法
demo:
public class Main { public static void main(String[] args) { MyTread mt1 = new MyTread(); mt1.start(); for (int i=1; i<=20; i++) { System.out.println("main" + i); } } } class MyTread extends Thread { @Override public void run(){ for (int i=0; i<20; i++) { System.out.println("run" + i); } } }
获取/设置线程名称
获取名称:
-
-
static Thread currentThread(): 返回当前正在执行的线程对象的引用
设置名称:
-
-
Thread(String name): 调用父类的构造方法 , 传入线程名称
获取名称:
public class Main { public static void main(String[] args) { MyTread mt1 = new MyTread(); mt1.start(); System.out.println("name: " + Thread.currentThread().getName()); } } class MyTread extends Thread { @Override public void run(){ System.out.println("name: "+ Thread.currentThread().getName()); } } 运行结果: name: main name: Thread-0
设置名称:
public class Main { public static void main(String[] args) { MyTread mt1 = new MyTread(); System.out.println(mt1.getName()); mt1.start(); // 更改线程名称 mt1.setName("打印线程222222"); System.out.println(mt1.getName()); } } class MyTread extends Thread { public MyTread(){ super("打印线程1"); } @Override public void run(){} } 运行结果: 打印线程1 打印线程222222
实现 Runnable 接口, 开启多线程:
public class Main { public static void main(String[] args) { // 创建一个 Runnable 接口的实现类对象 RunnableImpl run = new RunnableImpl(); // 创建 Thread 类对象, 构造方法中传入 Runnable 实现类对象 Thread mt = new Thread(run); mt.start(); } } class RunnableImpl implements Runnable{ @Override public void run(){ System.out.println(Thread.currentThread().getName()); } }
-
一个类只能继承一个类, 而一个类可以实现多个接口(实现了 Runnable 接口, 还能实现其它的接口 , 继承其它的类)
-
增强程序的扩展性, 降低耦合性(解耦合)
实现 Runnable 接口的方式, 把设置线程任务和开启新线程进行了分离
实现类中, 重写了 run 方法: 用来设置线程任务
创建 Thread 类对象, 传入 run 方法, 开启线程
ending ~