多线程的了解
什么是多线程:
1是指从软件或者硬件上实现多个线程并发之执行的技术
2 具有多线程能力的计算机因有硬件支持而能够同一时间执行的多个线程,提升能力
举个例子:(多线程就是同时执行多个应用程序)
一个小伙在玩电脑,左手玩着电脑右手一会按几下鼠标一会拿一下烟一会拿一下可乐因为右手的手速特别快在别人看来就是在同时在做三件事情我们的右手就相当于于是CPU我们右手做的那些操作相当于是在执行的程序,我们右手做的操作就相当于是多线程的操作。
并发和并行的区别:
并行: 在同一时刻,有多个指令在多个CPU上交替执行
并发:
在同一时刻有多个指令在单个CPU上同时执行
进程和线程的区别:
进程就是正在运行的软件:进程包含以下三点
-
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度和调度的独立单位
-
动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的
-
并发性:任何进程都可以同其他进程一起并发执行
线程: 是进程中的单个顺序控制流,是一条执行路径(一个进程包含多个线程,一个进程里有多个线程在执行,一个进程里必须有一个线程) -
单线程:见名知意单进程就是一个进程里面只有一个线程执行的路径
-
多线程:一个进程有多个线程在执行
创建线程的方式
- 第一种定义一个类继承Thread类重写run方法
注意: 直接执行run方法体代码不是开启线程,start才是开启线程的方法 ,而我们开启线程是执行run方法体重的代码
public class MyThread extends Thread {
@Override
public void run() {
for(int i=0; i<100; i++) {
System.out.println(i);
}
}
}
public class MyThreadDemo {
public static void main(String[] args) {
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
//开启一条线程
my1.start();
my2.start();
}
}
2 第二种: 实现多线程的方式
定义一个MyRunnable类实现Runnable接口
在MyRunnable类中重写run()方法
创建MyRunnable类中的对象
创建Thread类对象,将MyRunnable对象作为构造函数方法的参数
启动线程
/**
* @Date: 2022/4/1 15:49
* @Author: si.ma.zong.ze
*/
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
}
/**
* @Date: 2022/4/1 15:54
* @Author: si.ma.zong.ze
*/
public class Demo {
public static void main(String[] args) {
MyRunnable myRunnable= new MyRunnable();
Thread t= new Thread(myRunnable);
t.start();
}
}
3 第三种实现方式 第三种实现方式是有返回值的
定义一个MyCallable实现Callable接口
在MyCallable类中重写call()方法
创建MyCallable类对象
创建Future的实现类FutureTask对象,把MyCallable对象作为构造方法参数
创建Thread类的对象,把FutureTask对象对象作为构造方法的参数
启动线程
/**
* @Date: 2022/4/1 16:11
* @Author: si.ma.zong.ze
*/
public class MyCallable implements Callable<Object> {
@Override
public Object call() throws Exception {
for (int i = 0; i < 100; i++) {
System.out.println("追求女孩"+i);
}
return "答应了";
}
/**
* @Date: 2022/4/1 16:12
* @Author: si.ma.zong.ze
*/
public class Demo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyCallable myCallable= new MyCallable();
FutureTask<String> futureTask= new FutureTask(myCallable);
Thread thread= new Thread(futureTask);
thread.start();
String s = futureTask.get();
System.out.println(s);
}
线程方法:
1设置别名
setName(String name) 将此线程的名称更改为等于参数name
getName() 返回此线程的名称
currentThread() 返回对当前正在执行的线程对象的引用
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName()+":"+i);
}
}
}
public class MyThreadDemo {
public static void main(String[] args) {
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
//void setName(String name):将此线程的名称更改为等于参数 name
my1.setName("高铁");
my2.setName("飞机");
//Thread(String name)
MyThread my1 = new MyThread("高铁");
MyThread my2 = new MyThread("飞机");
my1.start();
my2.start();
//static Thread currentThread() 返回对当前正在执行的线程对象的引用
System.out.println(Thread.currentThread().getName());
}
}
2线程优先级
getPriority() 返回此线程的优先级
**setPriority(int newPriority)**更改此线程的优先级 线程默认优先级是5;线程优先级的范围是:1-10
public class ThreadPriority extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++)