1.并发和并行
并发:两个或多个事件在同一时间段内发生
并行:两个或多个时间在同一时刻发生(同时发生)
2.线程与进程
- 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行同一个程序即使一个进程从创建、运行到消亡的过程
- 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程
2.1进程
ROM:Read-Only Memory
只读内存简称,只读存储器—-硬盘
RAM:Random Access Memory
随机存取存储器—-内存
2.2线程
3.线程调度
- 分时调度
- 所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间
- 抢占式调度
4.2内存图解
5.Thread类
5.1获取和设置线程名
Thread类中设置和获取线程名称的方法
- void setName(String name):将此线程的名称更改为等于参数name
- String getName():返回此线程的名称
- 通过构造方法也可以设置线程名称
如何获取main()方法所在的线程名称?
- public static Thread currentThread():返回对当前正在执行的线程对象的引用 ```java package com.study_01.getName;
public class MyThread extends Thread{ public MyThread() { }
public MyThread(String name) {
// 把线程名称给父类,让父类给他取名字
super(name);
}
@Override
public void run() {
// 获取线程名称
System.out.println(Thread.currentThread().getName());
}
}
```java
package com.study_01.getName;
public class Demo01GetThreadName {
public static void main(String[] args) {
// 开启多线程
MyThread mt = new MyThread();
mt.setName("子线程1");
mt.start();
// 开启多线程
new MyThread("子线程2").start();
System.out.println("main:"+Thread.currentThread().getName());
}
}
/*
子线程1
子线程2
main:main
*/
5.2 线程控制
public class Demo01Sleep {
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
5.3通过Runable来实现多线程
package com.study_04.Runable;
public class RunableImpl implements Runnable {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + "-->" + i);
}
}
}
package com.study_04.Runable;
public class Demo01Runable {
public static void main(String[] args) {
RunableImpl run = new RunableImpl();
Thread t = new Thread(run);
t.start();
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + "-->" + i);
}
}
}
5.4匿名内部类实现多线程
package com.study_05.InnerClassThread;
public class Demo01InnerClassThread {
public static void main(String[] args) {
// 线程的父类是Thread
// new MyThread().start
new Thread(){
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
}
}.start();
// 线程的接口Runnable
// Runnable r = new RunnableImpl(); // 多态
Runnable r = new Runnable(){
// 重写run方法设置线程任务
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
}
};
new Thread(r).start();
// 简化接口的方式
new Thread(new Runnable(){
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
}
}).start();
}
}