聊一下程序,进程和线程。
程序就是我们平时代码生成的指令和变量数据。是属于静态的(死的)
进程是执行程序的一次执行过程,程序动起来了,就是进程。是系统资源分配的单位。
线程是CPU调度和执行的单位。进程中包含若个线程(>=1)
否则没有存在的意义 。
真多线程: 是指有多个CPU同时在运行。
假多线程:是指一个CPU不断的切换执行任务,切换的速度超过了任务的完成速度,让用户有了同时在执行的错觉。
线程
如何创建线程(第一种方法,不建议使用,因为单继承)
- 第一 新建一个类,用继承java.lang.Thread 类,Override重写 Run 方法
- 第二 在Run 方法中实现 线程执行代码即可
- 第三 创建线程对象,调用start方法来启动线程。
需要注意
-
多线程 是抢占式 响应,按照优先级来
-
若没有默认的优先级,则每次都会出现不同的运行结果。
-
多次启动一个线程是非法的
-
public class MyThread extends Thread{ @override publice void run(){ //线程执行代码 } } //调用 public static void main(String[] args){ MyThread myTh = new MyThread(); myTh.start(); }
内存详解
每增加一个线程,就会多一个线程的栈空间,Main栈空间是主要的,
只要是调用了线程的Start方法,就会增加一个栈空间,并在里面执行run方法
创建线程的第二种方法(推荐使用,通过接口)
通过 实现Runnable接口的实现类来重写run方法
把实现了的接口类传进 Thread(Runnable )带参数构造方法
然后在调用Thread.start()方法
// 创建 一个Runnable的实现类对象
RunnableDemo run1 = new RunnableDemo();
// 然后 run1 传入 Thread
Thread t = new Thread(run1);
// 启动多线程
t.start();
实现Runnable 的好处:
1、避免了单继承的局限性
一个类只能有一个亲爹(单继承)
实现了Runnable 接口,还能继承其他类,和实现其他接口
2、达到了解耦效果
实现Runnable接口,把创建新线程和Run方法都进行了分离
实现类中 重写了run方法
通过Thread 的 start方法开启新线程
线程相关的方法
Thread 的 sleep方法
Thread.sleep( //毫秒 )
这个 静态 方法用来 暂时停止 线程的运行
调用时可能会抛出异常
获取线程名字
getNume()
获取当前线程
currentThread()
修改线程名字
- 2种方法
1、在创造一个带参的构造方法,里面调用父类的带参方法,让父类给新线程起个名字
public class MyThread(String name){
super.(name);
}
2、通过setName(“新名字”)方法
Thread th = new Thread();
th.setName(“毛崽”);
利用匿名内部类 创建多线程
匿名 没有名字
内部类:在其他类中实现
匿名内部类,还有另一种方法,就是使用lambda表达式
MyThread mm= new MyThread();
mm.start()
//内部类实现
new MyThread(){
//override
run(){
}
}.start();
//内部类实现
Runnablemy r = new Runnablemy(){
@override
run(){
}
}
new Thread(r).start();
//更简约
new Thread(new Runnablemy(){
@override
run(){
}
}).start();